將 IIS 應用程式集區從 .NET 2.0/3.5 (經典模式) 升級至 .NET 4.0 (整合模式) 時,httpModules 與 httpHandlers 設定需遷移至 <system.webServer> 區段,否則模組不會執行。本文以自訂 HttpModule 為例實測差異與解決方案。
public class MyHttpModule : IHttpModule {
public void Dispose() { }
public void Init(HttpApplication context) {
context.BeginRequest += (s, e) => {
var app = (HttpApplication)s;
app.Response.Clear();
app.Response.Write("HttpModule");
app.Response.End();
};
}
}
<system.web>
<httpModules>
<add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication" />
</httpModules>
</system.web>
✅ 頁面輸出「HttpModule」,模組正常執行。
切換至整合模式應用程式集區後,頁面無輸出,證明 <system.web>/httpModules 在整合管線中不再被讀取。
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
<remove name="ScriptModule" />
<add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</modules>
</system.webServer>
validateIntegratedModeConfiguration="false":關鍵,關閉 IIS 對 <system.web> 區段的相容性檢查,否則會拋出 HTTP 500.22 錯誤(偵測到不適用於整合模式的 ASP.NET 設定)。preCondition="managedHandler":指定模組僅對受控處理常式生效,避免靜態檔案請求觸發模組。httpModules、httpHandlers 均需遷移至 <system.webServer>/modules、/handlers。| 錯誤 | 原因 | 解決 |
|---|---|---|
| HTTP 500.22 | 未加 validateIntegratedModeConfiguration="false",且保留 <system.web>/httpModules | 加入該屬性,或移除舊區段註冊 |
| 模組不執行 | 僅在 <system.web> 註冊 | 同步在 <system.webServer>/modules 註冊 |
| 靜態檔案也觸發模組 | 缺少 preCondition="managedHandler" | 加上前置條件限制 |
結語:整合模式是 .NET 4.0+ 的預設且推薦管線,統一處理所有請求(含靜態檔案),效能更優。遷移核心在於將模組/處理常式註冊移至 system.webServer 並關閉相容性驗證。