环境:asp.net 2.0
问题:文件下载的时候需要用户登录并且扣除相应的积分,用IE下载的时候没有问题。可是当用flashget等多线程工具下载
      的时候,积分会被重复扣除。
曾经想过的办法: 下载的时候用session记住本次下载,然后再次来的时候判断是否下载过,是的话不扣积分。就是一个资源只扣一次积分。后来发现这个办法不是很管用,可能因为多线程实在太快了,session的值还没付上,第二个线程就来了。

解决方案 »

  1.   

    重复下载不扣积分机制是有的,我是用session记住资源ID的,基本上只要session不过期重复下载都不会扣除积分的。
    但是这个session判断好像对于多线程不好用,基本是无视
      

  2.   


    建一个下载记录的表,把每个用户下载的记录都保存在里面(存文件也可以)
    那就可以根据(用户ID+资源ID)来判断数据库里面是否下载过了啦?
      

  3.   

    建一个下载记录的表,这是必须的
    其实暂时多扣了也没有关系,在后台你可以有一个job定期去检查,发现都扣了可以返还就可以了。就像出口退税一样,先按照规则把税收了,则按照一定的规则去返回,也就说说分两部走!
      

  4.   

    建一个下载记录的表,把每个用户下载的记录都保存在里面(存文件也可以) 
    那就可以根据(用户ID+资源ID)来判断数据库里面是否下载过了啦?
    当然是多线程的情况,要按步骤来扣积分就不会重复扣了:
    1.下载文件;
    2.把(用户ID+资源ID)写入下载记录表;
    3.根据下载记录表里面的记录来扣用户总积分;
      

  5.   

    建一个下载记录的表,把每个用户下载的记录都保存在里面(存文件也可以) 
    那就可以根据(用户ID+资源ID)来判断数据库里面是否下载过了啦?
    当然是多线程的情况,要按步骤来扣积分就不会重复扣了:
    1.下载文件;
    2.把(用户ID+资源ID)写入下载记录表;
    3.根据下载记录表里面的记录来扣用户总积分;
      

  6.   

    如果记录入库的话多次查询基本上是一定要的了。或者声明请使用IE的右键另存或者火狐浏览器进行下载迅雷,FLASHGET请设置单线程,否则将遭遇可怕的积分狂扣事件~~
      

  7.   


    当然要检查,不然怎么可以防止重复下载不扣积分,检查这种操作不会增加程序复杂度,你用存储过程实现也只是多了个IF而已?if not exists(select * from 下载记录表 where 用户ID=用户ID  and 资源ID=资源ID)
    begin
       写下载记录表
       扣除积分
    end
      

  8.   

    感谢各位大哥们的参与
    特别是
    wangkun9999 
    HDNGO   两位