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

C# 其他选项卡正在下载文件(从同一网站)时无法访问网站,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,因此,我正在开发一个.NETMVC项目,该项目运行在一个小型Web服务器上,资源有限。然而,该网站确实有一些相当大的文件供用户使用。由于服务器上可用RAM的数量有限,操作的标准FileResult返回类型导致OutOfMemoryException 所以我必须解决这个问题,因为升级服务器不是一个选项。我提出了以下解决方案: public partial class DownloadController : Controller { // GET: Download public

因此,我正在开发一个.NETMVC项目,该项目运行在一个小型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();
        }

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


如果您有任何建议,我们将不胜感激。

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

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

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


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

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

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


如果这确实是一些用户建议的会话锁定,那么您可以通过禁用此控制器上的会话状态来修复它。当然,您没有在该控制器的任何位置使用sessionState

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

如果这确实是一些用户建议的会话锁定,那么您可以通过禁用此控制器上的会话状态来修复它。当然,您没有在该控制器的任何位置使用sessionState

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

可能只是ASP.NET会话线程锁。如果我做对了,你就无法解决这个问题。我可能在这里问了一个愚蠢的问题-但我不需要访问会话变量才能创建会话线程锁吗?不,你必须启用会话。可能只是ASP.NET会话线程锁。如果我做对了,你就无法解决这个问题。我可能在这里问了一个愚蠢的问题——但我不需要访问会话变量才能创建会话线程锁吗?不,你必须启用会话。