其他选项卡正在下载文件时(从同一网站)无法访问网站

时间:2018-09-12 12:19:10

标签: c# asp.net-mvc asp.net-mvc-5

因此,我正在开发一个.NET MVC项目,该项目可在资源有限的小型Web服务器上运行。但是,该站点确实有一些很大的文件供用户使用。并且由于服务器上可用RAM的数量有限,操作的标准FileResult返回类型导致产生OutOfMemoryException

所以我必须解决此问题,因为升级服务器不是一种选择。我想到了以下解决方案:

public partial class DownloadController : Controller
{
    // GET: Download
    public virtual ActionResult Index(string path)
    {

        try
        {
            fullPath = Server.MapPath($"~/downloadable_files/{path}");
            var fileName = fullPath.Substring(fullPath.LastIndexOf('\\') + 1);

            Response.Clear();
            Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Octet;
            Response.AppendHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = fileName }.ToString());

            Response.TransmitFile(fullPath);

            Response.End();

            return Redirect(Request.UrlReferrer.AbsoluteUri);
        }
        catch (Exception e)
        {
            return HttpNotFound();
        }

    }
}

这很好。但是,当用户下载文件时,他们无法继续在同一浏览器中浏览网站。就像动作在文件下载时锁定了到服务器的连接。我以前从未遇到过,我想知道它是否与我提供文件的方式有关?我感觉好像错过了一些基本知识。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

长时间运行的请求可能会导致Web应用程序中无法预测的结果和较差的性能。请求的默认超时设置为110秒。如果将会话状态与长时间运行的请求一起使用,则ASP.NET将在110秒后释放对Session对象的锁定。但是,释放锁定时,您的应用程序可能在对Session对象进行操作的中间,并且该操作可能无法成功完成。如果在运行第一个请求时阻止了来自用户的第二个请求,则第二个请求可能会以不一致的状态访问Session对象。

如果您的应用程序包括阻塞(或同步)I / O操作,则该应用程序将无响应。

要提高性能,请使用.NET Framework中的异步I / O操作。另外,使用WebSockets或SignalR将客户端连接到服务器。这些功能旨在有效地处理长时间运行的请求。

https://docs.microsoft.com/en-us/aspnet/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet-and-what-to-do-instead#long-running-requests-110-seconds

答案 1 :(得分:1)

如果确实按照某些用户的建议锁定了会话,那么您可以通过在此控制器上禁用会话状态来修复它。当然,您在此控制器内的任何地方都不会使用sessionState。

[ControllerSessionState(SessionStateBehavior.Disabled)]
public partial class DownloadController : Controller
{
  // etc.
}