ASP.NET:如何处理并行请求

ASP.NET:如何处理并行请求,asp.net,parallel-processing,msdn,Asp.net,Parallel Processing,Msdn,让我们想象一下网站上有两个页面:快速和慢速。请求减缓页面的执行时间为1分钟,请求减缓页面的执行时间为5秒 在我的整个开发生涯中,我认为如果第一次启动的请求很慢:他将(同步)调用DB。。。等待回答。。。若在此期间将完成对快速页面的请求,则在系统等待DB响应时将处理此请求 但今天我发现: HttpApplication类的一个实例用于在其生存期内处理许多请求。但是,它一次只能处理一个请求。因此,成员变量可用于存储每个请求的数据 这是否意味着我最初的想法是错误的 你能澄清一下他们的意思吗?我很确定事

让我们想象一下网站上有两个页面:快速和慢速。请求减缓页面的执行时间为1分钟,请求减缓页面的执行时间为5秒

在我的整个开发生涯中,我认为如果第一次启动的请求很慢:他将(同步)调用DB。。。等待回答。。。若在此期间将完成对快速页面的请求,则在系统等待DB响应时将处理此请求

但今天我发现:

HttpApplication类的一个实例用于在其生存期内处理许多请求。但是,它一次只能处理一个请求。因此,成员变量可用于存储每个请求的数据

这是否意味着我最初的想法是错误的


你能澄清一下他们的意思吗?我很确定事情正如我所期望的那样…

您最初的想法是正确的,文档也是正确的。IIS工作进程可以生成许多线程,每个线程都有自己的
HttpApplication
类实例。

ASP.NET将在单个工作进程(w3wp.exe)下为web应用程序托管多个AppDomain。它甚至可以在同一工作进程下共享不同web应用程序的AppDomain(如果它们被分配到同一个应用程序池)


ASP.NET创建的每个AppDomain都可以承载多个HttpApplication实例,这些实例服务于请求并贯穿ASP.NET生命周期。每个HttpApplication(正如您所说)一次可以响应一个请求。

由于asp.net会话锁定,如果两个请求使用具有读/写访问权限的相同会话状态,则必须在服务器端按顺序处理请求

您可以在此处找到更多信息:

并发请求和会话状态

对ASP.NET会话状态的访问在每个会话中是独占的,这意味着如果两个不同的用户同时发出请求,则会同时授予对每个单独会话的访问权限。但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将以独占方式访问会话信息。第二个请求仅在第一个请求完成后执行。(如果由于第一个请求超过锁定超时而释放了对信息的独占锁定,则第二个会话也可以访问。)如果@Page指令中的EnableSessionState值设置为ReadOnly,则对只读会话信息的请求不会导致对会话数据的独占锁定。但是,对于会话数据的只读请求可能仍然必须等待会话数据的读写请求设置的锁才能清除


很明显,它也可能会崩溃。你想说,在任何时刻都可能有几个HttpApplication实例。这对我来说没什么意义。。。我是否正确理解只有第一个创建的线程才会生成“应用程序启动”事件?顺便说一句,感谢您的帮助。:)
HttpApplication
类只是一个类,我认为您认为它不是一个类。我建议您深入研究asp.net管道体系结构。请参见此处:是的,在任何给定时刻都可能有多个HTT应用程序。每个线程在请求期间独占占用一个线程。因此,每个请求一个HttpApplication,但它可以跨请求重用。假设一个请求正在进行中,IIS收到一个新请求。它将在webapp的一个appdomain中创建一个新的HttpApplication实例,并使用新的HttpApplication为请求提供服务。在global.asax中启动应用程序是一件有趣的事情。实际上,每个APPDOMAIN只运行一次,而不是HttpApplication。另一方面,像HttpModules这样的东西在每个HttpApplication中运行一次。在我看来,一个web应用程序只有几个应用程序域没有任何意义。我说得对吗?顺便说一句,谢谢你的帮助。:)从多web应用程序的角度来看,这非常有意义。从安全角度来看,您肯定不希望两个不同的web应用程序在同一AppDomain中运行并共享资源。一般来说,据我所知,在单个工作进程中运行单独的AppDomain的目的是为了稳定,因此单个AppDomain故障不会导致整个web应用程序停机。是的,除非使用共享会话或缓存服务器(进程外),否则单例和缓存将特定于它所运行的AppDomain。如果您有多个负载平衡的前端服务器,您当然会遇到这些相同的问题。换句话说,ASP.NET应用程序中的静态值是危险的,在大多数情况下都应该避免,而不必仔细考虑(这可能是夸大其词,但只是说明一点).知道用
[AllowAnonymous]
属性标记的ASP.MVC操作会发生什么吗?当它们由同一个会话生成时,是否也会被序列化,尽管您不会接触该会话?处理此问题的任何人都可以检查此解决方案,以保持请求处理并行并提高性能: