首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 以程式碼管理 IIS 7+:Microsoft.Web.Administration API 完整指南

     編輯:關於C#

IIS 7 引入全新組態系統 (applicationHost.config),舊版 `System.DirectoryServices` (IIS 6 Metabase) 不再適用。官方提供 Microsoft.Web.Administration (MWA) 組件,以強型別物件模型管理網站、應用程式、虛擬目錄、應用程式池、工作進程、請求等。本文詳細說明組件參考、核心物件模型、常見操作範例與部署注意事項。

組件參考

  • DLL 路徑:`%windir%\System32\inetsrv\Microsoft.Web.Administration.dll`
  • NuGet:`Install-Package Microsoft.Web.Administration` (官方套件,版本對應 IIS 版本)
  • 專案需**以管理員權限執行** (修改 IIS 組態需要高權限)。

核心物件模型

ServerManager (進入點)
├── Sites (SiteCollection)
│   └── Site
│       ├── Applications (ApplicationCollection)
│       │   └── Application
│       │       ├── VirtualDirectories (VirtualDirectoryCollection)
│       │       │   └── VirtualDirectory
│       │       └── ...
│       └── Bindings (BindingCollection)
├── ApplicationPools (ApplicationPoolCollection)
│   └── ApplicationPool
├── WorkerProcesses (WorkerProcessCollection)
│   └── WorkerProcess
│       └── GetRequests() -> RequestCollection
└── ...

常見操作範例

1. 建立網站

using (var iis = new ServerManager())
{
    // 名稱、協定、繫結資訊、實體路徑
    iis.Sites.Add("MySite", "http", "*:8080:", @"D:\MySite");
    iis.CommitChanges();
}

2. 新增應用程式至網站

using (var iis = new ServerManager())
{
    var site = iis.Sites["MySite"];
    site.Applications.Add("/App1", @"D:\MyApp1");
    iis.CommitChanges();
}

3. 建立虛擬目錄

using (var iis = new ServerManager())
{
    var app = iis.Sites["MySite"].Applications["/App1"];
    app.VirtualDirectories.Add("/VDir", @"D:\SharedContent");
    iis.CommitChanges();
}

4. 執行期控制:停止/啟動網站

using (var iis = new ServerManager())
{
    var site = iis.Sites["MySite"];
    site.Stop();  // 或 site.Start()
    // 無需 CommitChanges,立即生效
}

5. 回收應用程式池

using (var iis = new ServerManager())
{
    iis.ApplicationPools["DefaultAppPool"].Recycle();
}

6. 列舉目前正在處理的請求 (即時監控)

using (var iis = new ServerManager())
{
    foreach (var wp in iis.WorkerProcesses)
    {
        Console.WriteLine($"w3wp.exe PID: {wp.ProcessId}");
        foreach (var req in wp.GetRequests(0)) // 0 = 所有 URL
        {
            Console.WriteLine($"  {req.Verb} {req.Url} | Client: {req.ClientIPAddr} | Elapsed: {req.TimeElapsed} | State: {req.TimeInState}");
        }
    }
}

7. 修改應用程式池 .NET CLR 版本 / 管線模式

using (var iis = new ServerManager())
{
    var pool = iis.ApplicationPools["MyPool"];
    pool.ManagedRuntimeVersion = "v4.0"; // 或 "" 表示無 managed code
    pool.ManagedPipelineMode = ManagedPipelineMode.Integrated; // 或 Classic
    iis.CommitChanges();
}

部署與權限關鍵點

項目說明
執行身分互動式:以管理員執行;服務:啟用「以系統管理員身分執行」或指定具備 IIS 管理權限的服務帳號
遠端管理MWA 僅支援**本機**管理。遠端需搭配 WinRM/PowerShell Remoting/IIS 管理服務 (WMSVC)
版本對應IIS 7.0/7.5/8.0/8.5/10.0 組件介面相容,但建議 NuGet 套件版本與目標 IIS 主版本一致
唯讀查詢`ServerManager.OpenRemote` 僅限舊版 Metabase,新版無遠端唯讀 API
例外處理`FileNotFoundException` (找不到 DLL)、`UnauthorizedAccessException` (權限不足)、`COMException` (組態鎖定/語法錯誤)

常見坑點

  • 忘記 `CommitChanges()`:建立/修改/刪除組態物件後必須呼叫,否則不寫入 `applicationHost.config`。
  • 並發修改:多執行緒/多進程同時操作 `ServerManager` 會導致組態鎖定衝突,建議加鎖或序列化操作。
  • 32/64 位元:MWA 組件為 `MSIL` (Any CPU),但依賴 `inetsrv` 目錄下的原生 DLL,確保專案 **Prefer 32-bit = false** 以 64 位元進程載入。
  • Express 版 IIS:IIS Express 組態檔位於 `%userprofile%\Documents\IISExpress\config\applicationhost.config`,MWA 同樣適用,需指定正確路徑:`new ServerManager(@"path\applicationhost.config")`。

結語

Microsoft.Web.Administration 是 IIS 7+ 程式化管理的標準方式,物件模型清晰、強型別、支援完整生命週期操作。掌握 `ServerManager`、`Site`、`Application`、`VirtualDirectory`、`ApplicationPool`、`WorkerProcess` 核心類別,即可實現自動化部署、環境佈建、監控儀表板、故障自癒等 DevOps 場景。記住:**管理員權限、CommitChanges、版本對應、本機限制** 四大鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved