標籤:
今天將開發好的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了,希望對被坑過的同學有所協助!
IIS7的整合模式下如何讓自訂的HttpModule不處理靜態檔案(.html .css .js .jpeg等)請求