記錄首次將 ASP.NET 應用程式部署至 Windows Server 2003 (IIS 6.0) 的真實經驗:從傳統 ASP 遷移、挑選 CMS、上線後遭遇「找不到檔案」錯誤,最終發現是 **ISAPI 擴展對應未啟用 .NET 版本** 的經典問題。
背景與選型
- 伺服器:Windows Server 2003 (內建 IIS 6.0),完整支援 .NET Framework。
- 現有環境:全 ASP (Classic ASP) 網站運行中。
- 目標:部署一套 .NET 文章發布系統 (CMS)。
- 嘗試 1:「荒野文章系統」——介面不錯,但標題寫死在 DLL,無法修改,作者失聯,放棄。
- 嘗試 2:「網奇新聞系統」——功能強、介面佳、可正常修改設定,決定採用。
本機開發一切正常
- Visual Studio 內建 Web Server (Cassini) 執行無誤。
- 資料庫連線、後台發文、前台瀏覽皆正常。
上線伺服器:錯誤「找不到檔案」
- 發布至 IIS 虛擬目錄,設定 `web.config`、資料庫連線字串。
- 瀏覽首頁 → **HTTP 404 / 「找不到檔案」** (非 ASP.NET 黃色錯誤頁,而是 IIS 原生 404)。
- 檢查:實體檔案存在、權限正確、虛擬目錄指向正確、預設文件 `Default.aspx` 已加入。
- 直接瀏覽圖片 (靜態檔案) → **正常顯示**,證明 IIS 靜態內容服務正常。
- 應用程式集區:.NET 版本、管線模式設定無誤。
關鍵發現:ISAPI 與 CGI 限制 / Web 服務擴展
在 IIS 6.0 管理員中:
- 展開本機電腦 → **Web 服務擴展 (Web Service Extensions)**。
- 發現兩個關鍵項目:**「ASP.NET v2.0.50727」** 與 **「ASP.NET v1.1.4322」** 狀態皆為 **「禁止」**。
- 預設 IIS 6.0 安全性鎖定:**所有未知的 ISAPI 擴展預設禁止執行**。
解決:啟用 ASP.NET ISAPI 擴展
- 在「Web 服務擴展」中,選取 **ASP.NET v2.0.50727** (或專案所需版本)。
- 點擊 **「允許」** 按鈕 (或右鍵 → 允許)。
- 同理啟用 **ASP.NET v1.1.4322** (若有舊版相容需求)。
- 重新整理瀏覽器,**網站正常顯示**!
IIS 6.0 Web 服務擴展:必須將 ASP.NET 版本設為「允許」
根因分析
- IIS 6.0 採用「預設拒絕」安全模型:安裝 .NET Framework 會註冊 ISAPI 對應 (`aspnet_isapi.dll`),但 **Web 服務擴展預設為禁止**,需管理員明確允許。
- 靜態檔案 (圖片、CSS、JS) 由 IIS 核心直接服務,**不經過 ASP.NET ISAPI**,故正常。
- .aspx、.asmx、.ashx 等動態副檔名對應至 `aspnet_isapi.dll`,**被 Web 服務擴展攔截拒絕**,回傳 404 (而非 500),極易誤導開發者以為檔案遺失。
延伸檢查清單 (避坑指南)
| 項目 | 檢查點 |
| ASP.NET 註冊 | `aspnet_regiis -i -enable` (確認 ISAPI 對應已註冊) |
| Web 服務擴展 | 目標 .NET 版本狀態 = **允許** |
| 應用程式集區 | .NET 版本正確、Managed Pipeline Mode (整合/經典)、Identity 權限 |
| 虛擬目錄/應用程式 | 已轉換為應用程式、預設文件含 Default.aspx、執行權限 = 腳本 |
| web.config | 、 (除錯期) |
| 資料庫連線 | 連線字串正確、防火牆開放 1433、SQL Server 允許遠端連線 |
| 檔案系統權限 | 應用程式集區身分 (Network Service / 自訂帳戶) 對網站目錄有讀/寫 (App_Data、Log) |
後記
這個「Web 服務擴展未啟用」是 IIS 6.0 時代最經典的部署坑,無數開發者 (含筆者) 曾在深夜對著 404 頁面抓狂。記住:**IIS 6.0 靜態檔案正常 ≠ ASP.NET 正常**,動態副檔名需通過 ISAPI 擴展許可清單。雖然 IIS 7+ 已改用模組化管線不再有此設定,但理解「預設拒絕、顯式允許」的安全哲學,對所有伺服器部署依然適用。