IIS7.5上的集成应用程序池,模块和HttpApplication管道

时间:2011-08-12 22:52:59

标签: asp.net iis-7 module iis-7.5

鉴于在集成模式下运行的应用程序池,apppool能够为“托管处理程序请求”(GET一个aspx页面)以及“非托管处理程序请求”(GET一个jpg文件)提供服务。

处理MHR请求时,应用程序池应考虑所有模块,但对于非MHR,不应考虑使用Managed Handler前提条件标记的模块。

应用程序池是否有两个不同的HttpAplication管道(一个用于MHR,另一个用于非MHR)? 或者他只有一个管道,并能够根据请求决定引发哪些httpAplication事件处理程序?

我猜应用程序池在httpApplication启动BeginRequest之前决定是否管理请求。至少在AuthenticateRequest之前。是吗?

  

链接中的响应:

     

IIS提供的所有资源都映射到配置中的处理程序。如果配置映射不存在,则对资源的请求将收到404 HTTP状态。除了在管道开始之前发生的配置映射之外,还可以在请求执行期间更改处理程序映射...

模块的Init函数只执行一次(可能在应用程序池启动中),与Managed Handler前提条件无关?

我猜apppool不会为每个请求创建整个管道(注册httpaplication事件等)。

提前致谢,

UPDATE1:在阅读链接后,我仍然“看到”两个不同的管道给定一个apppool。 通过不同的管道,我指的是在IIS管道中注册的两组不同的事件处理程序:

BEGIN_REQUEST
AUTHENTICATE_REQUEST
AUTHORIZE_REQUEST
RESOLVE_REQUEST_CACHE
MAP_REQUEST_HANDLER
ACQUIRE_REQUEST_STATE
PRE_EXECUTE_REQUEST_HANDLER
EXECUTE_REQUEST_HANDLER
RELEASE_REQUEST_STATE
UPDATE_REQUEST_CACHE
LOG_REQUEST
END_REQUEST

当集成模式下的应用程序池启动时,它可以查找模块部分并执行每个模块的Init函数(独立于前置条件设置)。每个模块的Init函数在一些IIS管道阶段中注册自己。但是在运行时处理非托管请求时,它应该跳过具有预处理托管处理程序的模块的事件处理程序。怎么办?

UPDATE2: 根据我的理解,应用程序池(Windows进程)托管ASP.Net运行时(System.Web中的httpRuntime?)。此运行时包含一个httpApplication对象池。当应用程序池启动时(或者可能直到第一个请求到达),实例化了几个httpApplications。此时调用httpModules的Init方法(在web.config中的模块下)。 在IIS7集成模式出现之前,我认为所有的httpApplication对象都是克隆,但是因为根据处理程序的请求类型(托管或非托管),应该考虑或不考虑某些httpModule,我推断httpRutime包含两个httpApplication池或者给定httpApplication对象只能处理托管处理程序请求或非托管的hadler请求,但绝不能处理两个......

1 个答案:

答案 0 :(得分:1)

我想你可以读一下这个 http://blogs.msdn.com/b/tmarq/archive/2007/08/30/iis-7-0-asp-net-pipelines-modules-handlers-and-preconditions.aspx

在那里你看到IIS只有一个管道。服务asp.net请求的“经典”方式始于IIS管道的EXECUTE_REQUEST_HANDLER事件。将经典模式下的ASP.NET视为IIS管道中的管道。

使用集成模式,您基本上可以在整个IIS管道系列事件中插入托管代码,例如将asp.net表单身份验证添加到静态文件(如.jpg)