c# - 在 MVC c# 中检测应用程序的现有下载

标签 c# asp.net-mvc download

我有一个 MVC 应用程序,它有一个为文件提供服务的操作。我有一个要求,如果用户启动了下载,则在当前下载完成之前,用户不能启动新的下载。

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

所以我的问题是您如何跟踪下载何时开始但尚未完成?我最初转向 IIS 中的动态 ip 限制,但问题是最终用户可能坐在一层又一层的代理后面,这可能无法使其可靠。有没有办法通过代码来做到这一点?

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

public async Task<ActionResult> Download()
    {
        Session["IsDownloading"]  = true;            
        await ServeFiles();
        return View("Index");
    }

public ActionResult CheckStatus()
    {
        var message = Session["IsDownloading"] ?? "Null";
        return Content(message.ToString());
    }
private async Task ServeFiles()
{
   try
   {    //Download async
   }
   finaly
   {
      Session["IsDownloading"] = false;
   }
}

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

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

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

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

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

最佳答案

我认为您需要三件事:识别用户,检查并阻止他是否有现有下载。

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

当客户端想要启动下载时,您可以使用 javascript 调用 CheckIsDownloading 操作,如果可以,则调用 Serve 获取文件。

在服务中再次检查并阻止他是否正在下载以避免他破解 js 并发出下载请求的情况。

注意:如果他没有登录并且您要确保只有一次下载,则用户身份部分很难完成。他可以随时删除 cookie(->新 session )并进行新下载。

关于c# - 在 MVC c# 中检测应用程序的现有下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36302272/

相关文章:

javascript - JQuery 设置后找不到 .NET 隐藏字段值

asp.net-mvc - 是否可以使用 Razor 创建通用的 @helper 方法?

C# Elmah - 当它在一个网站上工作但在同一服务器上的另一个网站上不工作时如何修复

delphi - 使用 TIdHttp 逐步下载文件

asp.net - 从 C#.net 中的 SVN 存储库下载文件

c# - NDepend 能否将所有方法中的代码输出到特定方法的依赖树中?

c# - .NET Compact Framework 上 DateTime.Now 中的毫秒数始终为零?

c# - .NET CF 位图类质量很差

jquery - 如何使用 JQuery 在 MVC4 中添加时间?

r - 以 Shiny 的形式下载 rpivotTable 输出