IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html .css .js .jpeg等)请求,而这不是我预期的效果,因为我只想让托管文件(aspx, ascx 及 MVC等)的请求被自定义HttpModule处理,但是我发现在IIS7的集成模式下所有请求都会进入HttpModule被处理。

后来我尝试将IIS7站点下的应用程序池改为了经典模式,这样的话静态文件的请求的确不会进入自定义HttpModule了,但是出现了另一问题ASP.NET项目中自定义的HttpHandler都访问失败了。。。这让我颇为头疼要么不能用自定义HttpModule。要么不能用自定义HttpHandler。

后来在网上找了资料才发现,ASP.NET 4.0后Web.config文件的Module配置节点有一个可选项叫preCondition如下面代码所示:

<system.webServer>
  <modules>
    <add name="MyModule" type="MyNamespace.MyModule" preCondition="managedHandler" />
  </modules>
</system.webServer>

注意这个选项只有在IIS7才用到的<system.webServer>的<modules>配置项才有,在老IIS6的<system.web>的<httpModules>配置节点下是没有的。加上了preCondition="managedHandler"这个配置项后,在IIS7的集成模式下,上面自定义的MyModule这个HttpModule就不会去处理静态文件(.html .css .js .jpeg等)的请求了,只会处理托管文件(aspx, ascx 及 MVC等)的请求。

此外在<system.webServer>的<modules>节点上还有个配置项叫runAllManagedModulesForAllRequests如下面代码所示:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="MyModule1" type="MyNamespace.MyModule1" preCondition="managedHandler" />
    <add name="MyModule2" type="MyNamespace.MyModule2" preCondition="managedHandler" />
    <add name="MyModule3" type="MyNamespace.MyModule3" preCondition="managedHandler" />
    <add name="MyModule4" type="MyNamespace.MyModule4" preCondition="managedHandler" />
    <add name="MyModule5" type="MyNamespace.MyModule5" />
  </modules>
</system.webServer>

如果你将runAllManagedModulesForAllRequests设置为true,那么ASP.NET就会忽略<modules>所有子节点的preCondition设置,相当于上面代码中MyModule1、MyModule2、MyModule3和MyModule4都没有设置preCondition="managedHandler",MyModule1到MyModule5仍然会处理静态文件(.html .css .js .jpeg等)的请求,所以runAllManagedModulesForAllRequests相当于是一个快捷设置,可以关闭<modules>所有子节点的preCondition设置,强制使所有自定义的HttpModule既处理静态文件(.html .css .js .jpeg等)请求又处理托管文件(aspx, ascx 及 MVC等)请求。

说了这么多有了preCondition这个设置,大家又可以安心使用HttpModule了,希望对被坑过的同学有所帮助!

时间: 2024-10-23 00:32:57

IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求的相关文章

曲线救国:IIS7集成模式下如何获取网站的URL

如果我们在Global中的Application_Start事件中访问HttpContext.Current.Request对象,如: protected void Application_Start() { var url=HttpContext.Current.Request.Url.ToString(); } 只是简单的想取一下当前网站的URL.在调试的时候一切正常,但当我们把网站发布到IIS上面的时候,如果IIS应该程序池在集成模式,就会是会报“请求在此上下文中不可用”的异常,但如果是经

IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析

问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决: 由于在集成模式下,默认进程标识是应用程序池名称相同的"用户", 如应用程序池为 tom, 那么在进程管理器中,w3wp.exe的用户即为tom 而IIS中要动态的为这种标识设计权限则需要同时给 IIS_IUSERS组  和  IUSR组设置完全控制权限!!! 记得是同时设置. 如果仅给

微软URLRewriter.dll的url重写在目标框架.Net Framework2.0、4.0和应用程序池经典模式、集成模式下的配置

大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池经典模式下配置使用该dll.还有一个web的例子.缺少处理程序映射的设置例子) 文章2:使用web.config中的httpHandlers (讲解了URLRewriter.dll是如何从原理上来处理URL重写地址来转发给真实的服务器地址上的) 文章3:检测到在集成的托管管道模式下不适用的ASP.N

IIS集成模式下,URL重写后获取不到Session值

近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的modules节点添加runAllManagedModulesForAllRequests="true"属性. <modules runAllManagedModulesForAllRequests="true"> <add name="URLMo

IIS7 应用程序池的 托管管道模式与集成模式小结【转帖】

IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解 IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上. 上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.c

IIS 7.0的集成模式和经典模式

IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库, 原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行.集成模式是一种统 一的请求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和管理的模块化,而且 增加了使用托管代码模块扩展IIS时的灵活性.如果老的Web应用程序运行于IIS7

iis 经典模式和集成模式

IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.两者区别大家可以参考下,根据实际情况选用. 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行.集成模式是一种统一的哀求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性

IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解

IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器仅运行一种模式,也可以令两种模式同时运行于一台服务器上. 上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.config文件都无法在集成管道模式下正常工作.利用AppCmd.exe,我们可以将经典管道模式下的配

IIS经典模式和集成模式的区别

IIS7.0中的Web应用程序有两种配置形式:经典模式和集成模式. 1.经典模式 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行 2.集成模式集成模式是一种统一的请求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和管理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性.如果老的Web