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

C# 建立 IIS 網站並設定 ASP.NET 2.0 版本(一):MetaBase.xml 直接操作方案

     編輯:關於C語言

方案背景

IIS 6.0+ 使用 `MetaBase.xml` 儲存設定。直接修改 XML 可建立網站並指定 ASP.NET 版本,但**需停止 IIS 服務**,影響現有網站,操作複雜、不直觀。

核心流程

  1. 掃描現有網站 ID,取得下一可用 ID。
  2. 停止 `IISAdmin` 及其相依服務(`W3SVC` 等),確保寫入安全。
  3. 載入 `MetaBase.xml`,使用 `XmlNamespaceManager` 註冊命名空間 `mxh`。
  4. 定位最後一個 `IISWebVirtualDir`(`/LM/W3SVC/{id}/root`)與 `IISFilters` 節點,取得 `AdminACL` 值。
  5. 建立新節點:`IISWebServer`(站點)、`IISFilters`、 `IISWebVirtualDir`(根虛擬目錄)。
  6. 設定關鍵屬性:`ServerBindings`(`:802:`)、`Path`(實體路徑)、`AccessFlags`、`AuthFlags`、`AppIsolated=2`(應用程式隔離)、`DirBrowseFlags`、預設文件、腳本對應(`ScriptMaps`)。
  7. `ScriptMaps` 硬編碼大量副檔名對應 `aspnet_isapi.dll v2.0.50727`,**極易因 .NET 版本/路徑變更失效**。
  8. 儲存 XML,重新啟動 `W3SVC` 服務。

程式碼關鍵片段


var root = new DirectoryEntry("IIS://localhost/W3SVC");
int siteId = 1;
foreach (DirectoryEntry e in root.Children)
    if (e.SchemaClassName == "IISWebServer")
        siteId = Math.Max(siteId, int.Parse(e.Name) + 1);

// 停止服務...
var configPath = Environment.SystemDirectory + @"\inetsrv\MetaBase.xml";
var doc = new XmlDocument(); doc.Load(configPath);
var xnm = new XmlNamespaceManager(doc.NameTable);
xnm.AddNamespace("mxh", "urn:microsoft-catalog:XML_Metabase_V64_0");

// 定位最後節點、建立新節點、設定屬性、ScriptMaps 硬編碼...
doc.Save(configPath);
// 重啟服務...

嚴重缺點與現代替代方案

  • **停機部署**:停止 IIS 影響所有網站,生產環境不可接受。
  • **XML 結構耦合**:版本升級命名空間/結構變更即失效。
  • **硬編碼 ScriptMaps**:.NET 版本、安裝路徑變更需同步修改。
  • **權限需求**:需管理員權限寫入 `system32\inetsrv`。

現代方案:使用 `Microsoft.Web.Administration` (ServerManager API) 或 PowerShell `New-Website`/`Set-WebConfigurationProperty`,支援線上變更、強型別、版本無關。

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