IIS7的集成模式下如何讓自定義的HttpModule不處理靜態文件(.html .css .js .jpeg等)請求

今天將開發好的ASP.NET站點部署到客戶的服務器上後,發現了一個很是頭疼的問題,那麼就是IIS7的應用程序池是集成模式的話,ASP.NET項目中自定義的HttpModule會處理靜態文件(.html .css .js .jpeg等)請求,而這不是我預期的效果,由於我只想讓託管文件(aspx, ascx 及 MVC等)的請求被自定義HttpModule處理,可是我發如今IIS7的集成模式下全部請求都會進入HttpModule被處理。css

 

後來我嘗試將IIS7站點下的應用程序池改成了經典模式,這樣的話靜態文件的請求的確不會進入自定義HttpModule了,可是出現了另外一問題ASP.NET項目中自定義的HttpHandler都訪問失敗了。。。這讓我頗爲頭疼要麼不能用自定義HttpModule。要麼不能用自定義HttpHandler。html

 

後來在網上找了資料才發現,ASP.NET 4.0後Web.config文件的Module配置節點有一個可選項叫preCondition以下面代碼所示:web

<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以下面代碼所示:spa

<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設置,至關於上面代碼中MyModule一、MyModule二、MyModule3和MyModule4都沒有設置preCondition="managedHandler",MyModule1到MyModule5仍然會處理靜態文件(.html .css .js .jpeg等)的請求,因此runAllManagedModulesForAllRequests至關因而一個快捷設置,能夠關閉<modules>全部子節點的preCondition設置,強制使全部自定義的HttpModule既處理靜態文件(.html .css .js .jpeg等)請求又處理託管文件(aspx, ascx 及 MVC等)請求,默認狀況下runAllManagedModulesForAllRequests是爲false的。3d

 

說了這麼多有了preCondition這個設置,你們又能夠安心使用HttpModule了,但願對被坑過的同窗有所幫助!code

相關文章
相關標籤/搜索