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等)請求,默認情況下runAllManagedModulesForAllRequests是為false的。

 

說了這么多有了preCondition這個設置,大家又可以安心使用HttpModule了,希望對被坑過的同學有所幫助!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM