检测MVC c#中的现有下载以查找应用程序

时间:2016-03-30 07:27:29

标签: c# asp.net-mvc downloading

我有一个MVC应用程序,它有一个提供文件的动作。我要求如果用户已启动下载,则用户无法在当前用户完成下载之前启动新的下载。

简单地说,用户一次只能下载一个文件。但是,我不想简单地阻止用户的请求,但希望能够让他们知道他们无法下载新的请求,因为他们正在下载现有的请求。

所以我的问题是你如何跟踪下载何时开始但还没有完成?我最初转向IIS中的动态IP限制,但问题是最终用户可能坐在层的代理层之后可能无法使其可靠。有没有办法通过代码执行此操作?

我还尝试使用FileWebRequest / FileWebResponse创建正在进行的流。但是当一个新请求进入时它会作为一个新动作进入,我不知道如何检查前一个流是否仍在进行中。

ReactClass

***********************更新*********************

我已更新示例代码。可以在c:\ temp下载文件的任何时候调用下载,然后在下载时,我试图调用 CheckStatus 但是它没有响应下载正在进行中。仅在下载完成时。

我在这里添加了一个项目解决方案。 https://github.com/janmchan/DownloadThrottling.git

***********************更新2016-04-04 **********

经过一些搜索,我发现会话(我正在使用SQLServer)在请求结束时保存,所以即使用户管理两个并发请求,会话变量也不会更新,直到结束请求使会话中的信息不可靠。所以现在,我正在寻找一种方法来在我更新值后立即手动强制会话状态保存。

2 个答案:

答案 0 :(得分:0)

我认为你需要3件事:识别用户,如果他现有下载,请检查+阻止。

最简单的方法是设置Session [" isDownloading"] = true;然后检查一下。完成下载后将其设置为false。

从客户端开始下载时,您可以使用javascript调用CheckIsDownloading操作,如果确定,请调用Serve来获取文件。

再次进行服务检查并阻止他是否正在下载,以避免他攻击js并发出下载请求的情况。

注意:如果用户身份部分尚未登录且您想要确保只有一次下载,则很难做到这一点。他可以随时删除cookie( - >新会话)并进行新的下载。

答案 1 :(得分:0)

我最终使用的最终解决方案类似于@ eugen的答案,但使用数据缓存(MemoryCache)而不是会话,该缓存立即生效并且不等待请求完成。虽然这只是在进行中,但这很好,因为我发现即使应用程序服务器将进行负载平衡,一旦建立会话,客户端基础结构保证它们将使用相同的服务器集合会议。

我同意Erik Funkenbusch的评论,即用户可以轻松解决此问题,此解决方案仅适用于此特定要求。