Asp.net mvc 3 如何允许多个用户同时执行冗长的mvc3操作并获得良好的响应时间?
我有3-4个与此相关的问题Asp.net mvc 3 如何允许多个用户同时执行冗长的mvc3操作并获得良好的响应时间?,asp.net-mvc-3,upload,controller,cassini,Asp.net Mvc 3,Upload,Controller,Cassini,我有3-4个与此相关的问题 如果行号X使用同步上传方法,则:- a。同一用户(同一会话)的另一个请求将如何处理:- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务 相同的操作方法,即_UploadStatement?-是排队还是同时上菜 b。来自不同用户(不同会话)的另一个请求将如何处理:- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务 相同的操作方法,即_UploadStatement?-是排队还是同时上菜 如果它们被放入队
- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务
- 相同的操作方法,即_UploadStatement?-是排队还是同时上菜
- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务
- 相同的操作方法,即_UploadStatement?-是排队还是同时上菜
这些行动将同时发生。每次IIS收到新请求时,它都会创建一个新控制器,并在新控制器实例上执行该操作。但是,每个控制器将使用不同的线程执行请求 只有当您有这样的代码时,用户B才能等到用户A完成上传:
public class AbcController : Controller
{
private static readonly object Lock = new object();
public ActionResult A1()
{
return view();
}
public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement)
{
lock (Lock)
{
// Some web service uploading a lengthy file received to other server (say amazon s3 storage):-
// LINE NUMBER - X
}
}
}
这样的锁会告诉线程“嘿,一次只允许我们中的一个人执行这个方法。现在我已经锁定了这个方法,你必须等到我完成。当我完成时,我会给你锁,然后你可以执行这个方法,让其他人等着你完成。”
操作方法不知道或不关心请求来自谁。如果用户A提交了3次上传,IIS将使用不同的线程并行执行所有上传。但是,它可能不会按请求的顺序返回结果。例如,第二个请求可能首先完成,然后是第三个,最后是第一个
但可能发生的是线程饥饿。假设你有50个用户同时上传3个文件。这意味着至少会从池中提取150个线程,这可能会导致应用程序的其他部分响应更慢。您可以研究从AsyncController进行扩展,以帮助解决由于线程阻塞而严重受限于I/O或潜在的任务上的线程不足情况。此行为与Visual Studio Development Server不同还是相同?因为我在VS Web Server.development中看到了不同的结果,它是针对IIS Express开发的,而不是“cassini”开发服务器。IIS将更紧密地匹配生产中发生的情况。我不能说卡西尼号是否使用1个线程来处理所有请求,所以我不得不推迟。但是知道我对卡西尼号的了解,这并不是不可能的。发生的事情是,如果我上传一个大文件,比如说10MB,点击提交,浏览器的加载图标旋转,这意味着请求正在处理中,但与此同时,如果我试图访问另一个操作,通过在浏览器中输入url,屏幕只有在上传完成后才会出现。-这意味着请求已被放入队列。这是您的浏览器阻止了您,而不是web服务器。浏览器将数据推送到服务器时,您需要等待。据我所知,防止这种情况发生的唯一方法是异步上传文件,但据我所知,这并不容易。无论哪种方式,队列都发生在浏览器上,服务器上没有任何东西排队,除非线程不足。不,这不是浏览器阻止我,文件没有从浏览器上载到服务器(该部分仅异步发生),而是使用amazon的web服务从服务器上载到另一台服务器。请参见第X行的注释。
public class AbcController : Controller
{
private static readonly object Lock = new object();
public ActionResult A1()
{
return view();
}
public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement)
{
lock (Lock)
{
// Some web service uploading a lengthy file received to other server (say amazon s3 storage):-
// LINE NUMBER - X
}
}
}