因此,我正在开发一个.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();
}
}
}
这很好。但是,当用户下载文件时,他们无法继续在同一浏览器中浏览网站。就像动作在文件下载时锁定了到服务器的连接。我以前从未遇到过,我想知道它是否与我提供文件的方式有关?我感觉好像错过了一些基本知识。
任何建议将不胜感激。
答案 0 :(得分:1)
长时间运行的请求可能会导致Web应用程序中无法预测的结果和较差的性能。请求的默认超时设置为110秒。如果将会话状态与长时间运行的请求一起使用,则ASP.NET将在110秒后释放对Session对象的锁定。但是,释放锁定时,您的应用程序可能在对Session对象进行操作的中间,并且该操作可能无法成功完成。如果在运行第一个请求时阻止了来自用户的第二个请求,则第二个请求可能会以不一致的状态访问Session对象。
如果您的应用程序包括阻塞(或同步)I / O操作,则该应用程序将无响应。
要提高性能,请使用.NET Framework中的异步I / O操作。另外,使用WebSockets或SignalR将客户端连接到服务器。这些功能旨在有效地处理长时间运行的请求。
答案 1 :(得分:1)
如果确实按照某些用户的建议锁定了会话,那么您可以通过在此控制器上禁用会话状态来修复它。当然,您在此控制器内的任何地方都不会使用sessionState。
[ControllerSessionState(SessionStateBehavior.Disabled)]
public partial class DownloadController : Controller
{
// etc.
}