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

C# 讀取 IIS 網站屬性實戰:從下拉選單選中到詳細資訊回填

     編輯:關於C語言

場景:管理介面選中網站後自動回填詳細屬性

典型 WinForms/WebForms 管理工具:左側 ComboBox 列出網站名稱,使用者選中後,右側 TextBox 自動顯示 IP、Port、Host Header、物理路徑等屬性。本文提供完整的事件處理與資料存取代碼。

核心邏輯:三步驟

  1. 取得選中的網站名稱(ServerComment)。
  2. 依名稱查詢 Site ID。
  3. 連線 Site 節點讀取屬性,解析綁定字串,遍歷子節點取得物理路徑。

完整代碼實作

1. ComboBox 選中事件處理

private void cmbSites_SelectedIndexChanged(object sender, EventArgs e) {
    string selectedName = cmbSites.SelectedItem?.ToString();
    if (string.IsNullOrEmpty(selectedName)) return;

    string siteId = GetWebSiteIdByName(selectedName);
    if (string.IsNullOrEmpty(siteId)) {
        MessageBox.Show("找不到對應網站");
        return;
    }

    string sitePath = $"IIS://localhost/W3SVC/{siteId}";
    using (var siteEntry = new DirectoryEntry(sitePath)) {
        // 1. 解析 ServerBindings: "IP:Port:HostHeader"
        string bindings = siteEntry.Properties["ServerBindings"]?.Value?.ToString() ?? "";
        string ip = "", port = "", hostHeader = "";
        if (!string.IsNullOrEmpty(bindings)) {
            var parts = bindings.Split(':');
            if (parts.Length >= 3) { ip = parts[0]; port = parts[1]; hostHeader = parts[2]; }
        }

        // 2. 遍歷子節點找 ROOT 虛擬目錄取得物理路徑
        string physPath = "";
        foreach (DirectoryEntry child in siteEntry.Children) {
            if (child.SchemaClassName == "IISWebVirtualDir" && child.Name == "ROOT") {
                physPath = child.Properties["Path"]?.Value?.ToString() ?? "";
                break;
            }
        }

        // 3. 回填 UI
        txtIp.Text = ip;
        txtPort.Text = port;
        txtHostHeader.Text = hostHeader;
        txtPhysicalPath.Text = physPath;
    }
}

2. 通用查詢 Site ID 方法(支援 Comment 與 Host Header 雙重比對)

public string GetWebSiteIdByName(string siteName) {
    using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
        foreach (DirectoryEntry site in root.Children) {
            if (site.SchemaClassName != "IISWebServer") continue;

            // 比對 ServerComment(網站描述名稱)
            string comment = site.Properties["ServerComment"]?.Value?.ToString() ?? "";
            if (string.Equals(comment, siteName, StringComparison.OrdinalIgnoreCase))
                return site.Name;

            // 比對 ServerBindings 中的 HostHeader
            string bindings = site.Properties["ServerBindings"]?.Value?.ToString() ?? "";
            if (!string.IsNullOrEmpty(bindings)) {
                var parts = bindings.Split(':');
                if (parts.Length >= 3 && string.Equals(parts[2], siteName, StringComparison.OrdinalIgnoreCase))
                    return site.Name;
            }
        }
    }
    return string.Empty;
}

進階:一次性載入所有網站到 ComboBox

private void LoadSitesToComboBox() {
    cmbSites.Items.Clear();
    using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
        foreach (DirectoryEntry site in root.Children) {
            if (site.SchemaClassName == "IISWebServer") {
                string name = site.Properties["ServerComment"]?.Value?.ToString() ?? site.Name;
                cmbSites.Items.Add(name);
            }
        }
    }
    if (cmbSites.Items.Count > 0) cmbSites.SelectedIndex = 0;
}

關鍵屬性速查表

屬性名稱類型說明範例
ServerCommentstring網站描述名稱(管理員自訂)"My Corporate Portal"
ServerBindingsstring綁定資訊,格式 IP:Port:HostHeader"192.168.1.10:80:www.example.com"
ServerStateint網站狀態:1=啟動, 2=停止, 4=暫停1
Path (於 ROOT 虛擬目錄)string網站實體磁碟路徑"D:\WebSites\MySite"
AppPoolId (IIS 7+)string所屬應用程式池名稱"MySiteAppPool"

避坑與最佳實踐

  1. 屬性可能為 null:務必使用 ?.Value?.ToString() 防禦性編程。
  2. ServerBindings 可能多行:一個網站可有多條綁定(多 IP/HostHeader),屬性值會包含換行符,需 Split('\n') 逐行解析。
  3. 大小寫不敏感比對:網站名稱、HostHeader 比對建議用 StringComparison.OrdinalIgnoreCase。
  4. 效能優化:頻繁查詢時,可一次性載入所有網站資訊快取到 List,UI 直接繫結快取資料。
  5. IIS 7+ 建議改用 ServerManager:serverManager.Sites["Name"].Bindings 提供強型別 Binding 物件集合,免去字串解析麻煩。

總結

掌握 DirectoryEntry 讀取 IIS 網站屬性的標準流程——**查 ID → 連節點 → 解析綁定 → 遍歷虛擬目錄**——即可快速構建 IIS 管理工具的核心資料存取層。配合防禦性編程與快取策略,打造穩健好用的管理介面。

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