IIS 部署多個 API 筆記

概述 本文紀錄如何在已運行一個 API 服務的 IIS 伺服器上,部署第二個(例如測試用)API。 方法:在同一個網站下建立子應用程式 (Sub-application) 這是在現有網站下新增 API 最直接的方法,因為此方法不需要更改 DNS 或防火牆規則(否則你要設定新的 domain name,或是在既有 domain 下使用一個未使用的 port),僅透過 URL 路徑來區分不同的 API。例如: 正式 API 呼叫路徑:http://yourdomain.com/endpoint 測試 API 呼叫路徑:http://yourdomain.com/test-api/endpoint 原理說明:應用程式集區 (Application Pool) 的隔離機制 「應用程式集區」是 IIS 中實現服務隔離的關鍵。它是一個獨立的容器,由 IIS 工作者處理序 (w3wp.exe) 管理。為新的測試 API 建立一個「全新的、獨立的」應用程式集區主要有以下三個好處: 隔離性 (Isolation):最重要的優點。如果測試 API 因錯誤而崩潰,只會影響其自身的集區,正式運行的 API 服務將完全不受影響,確保了主服務的穩定性。 安全性 (Security):可以為不同的集區設定不同的執行身分 (Identity),從而對檔案系統、資料庫等資源進行權限隔離。 獨立設定 (Configuration):每個集區可以有獨立的設定,如 .NET 版本、記憶體上限、CPU 使用率限制等,讓正式與測試環境的配置完全分開。 IIS 設定步驟 開啟 IIS 管理器,在左側窗格中找到您現有的網站。 在網站上按右鍵,選擇「新增應用程式」。 在「新增應用程式」視窗中,填寫以下資訊: 別名 (Alias):設定 URL 路徑,例如 test-api。這將成為新 API 的存取路徑的一部分。 實體路徑 (Physical path):指向您測試 API 發布檔案所在的資料夾。 應用程式集區 (Application Pool): 點擊「選取…」。 在彈出視窗中,點擊「新增…」來建立一個新集區。 為新集區命名(例如 TestApiAppPool)。 (.NET Core 的設定於後面詳述) 確認選取了這個剛剛建立的新集區。 點擊「確定」完成設定。 部署 .NET Core API 的特別注意事項 部署 .NET Core / .NET 5+ 的應用程式時,其運作模式與傳統 ASP.NET Framework 不同,設定上有一處關鍵差異。 ...

August 6, 2025 · 1 分鐘

NuGet 套件遺失問題紀錄

Generated by Perplexity 問題說明 前陣子我遇到一個值得記錄的問題(至少對我而言):在維護一個有點舊的 .NET framework 專案時,發現透過 ProjectReference 方式依賴的 NuGet 套件無法自動還原。經過一番調查後,才發現這是 NuGet 在處理某些舊式專案時的一個行為特性。對 .NET 很不熟的我覺得可以記錄一下,以防未來又忘記。 專案結構與重現情境 MainApp.csproj ← 主專案,透過 ProjectReference 參考 SharedLibrary.csproj └── SharedLibrary.csproj └── <PackageReference Include="ICSharpCode.SharpZipLib" /> 我的 solution 中有兩個專案: MainApp.csproj:主應用程式專案 SharedLibrary.csproj:共用函式庫,透過 ProjectReference 被 MainApp 參考 在 SharedLibrary.csproj 中,使用了常見的壓縮解壓縮函式庫 ICSharpCode.SharpZipLib,並以以下方式引用: <PackageReference Include="ICSharpCode.SharpZipLib" Version="1.4.2" /> 然而在建置 MainApp.csproj 時,卻發現 SharpZipLib 的相關類別無法解析,沒有編譯出 .dll 檔。反觀其他套件如 NPOI 和 EntityFramework 則一切正常,讓我相當困惑(因為不論是在 prodution 或是 test 環境中都沒看到 .dll 缺失的問題)。 至於為什麼會發生這種事情,我想…就技術債這三個字吧 嘗試與排查過程 一開始我找問題的方式比較粗暴簡單,那就是找其他也有引用 SharedLibrary.csproj,但卻可以成功編譯的專案,看他們跟有問題的專案差在哪裡。於是我找到了其他專案多的這一行: <PackageReference Include="EntityFramework" Version="5.0.0" /> 神奇的事情發生了,SharpZipLib 居然也能正確還原了! 這讓我開始懷疑問題出在 NuGet 的套件還原邏輯上。經過研究,終於找到癥結所在。 ...

July 7, 2025 · 1 分鐘