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

C# 操作 IIS 6 Metabase 建立網站並指定 ASP.NET 2.0:XML 直寫法

     編輯:關於C#

背景與限制

IIS 6 將設定儲存在 MetaBase.xml。直接修改 XML 可建立網站、設定腳本對應,但需停止 IIS Admin Service,會影響現有網站,生產環境慎用。建議改用 Microsoft.Web.Administration (IIS 7+) 或 DirectoryEntry (ADSI) 非離線操作。

核心步驟

  1. 透過 DirectoryEntry("IIS://localhost/W3SVC") 列舉現有站點,取得未使用的 Site ID。
  2. 停止 IISAdmin 服務及其相依服務(W3SVC 等)。
  3. 載入 %SystemRoot%\system32\inetsrv\MetaBase.xml,使用 XmlDocument 操作。
  4. 複製現有站點節點結構,修改 Location、ServerComment、ServerBindings、Path、ScriptMaps 等屬性。
  5. ScriptMaps 關鍵:將 .aspx、.ashx 等對應到 aspnet_isapi.dll v2.0 版本路徑(C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll)。
  6. 儲存 XML,重新啟動 W3SVC 服務。

關鍵程式碼片段

// 1. 取得新 Site ID
int siteID = 1;
foreach (DirectoryEntry e in root.Children)
    if (e.SchemaClassName == "IIsWebServer")
        siteID = Math.Max(siteID, int.Parse(e.Name) + 1);

// 2. 停止服務
var iisAdmin = new ServiceController("IISAdmin");
foreach (var dep in iisAdmin.DependentServices)
    if (dep.Status != ServiceControllerStatus.Stopped) dep.Stop();
iisAdmin.Stop(); iisAdmin.WaitForStatus(ServiceControllerStatus.Stopped);

// 3. 操作 MetaBase.xml
string configPath = Environment.SystemDirectory + @"\inetsrv\MetaBase.xml";
XmlDocument doc = new XmlDocument(); doc.Load(configPath);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("mxh", "urn:microsoft-catalog:XML_Metabase_V64_0");

// 4. 建立 IIsWebServer、IIsFilters、IIsWebVirtualDir 節點
//    設定 ScriptMaps 包含 v2.0 aspnet_isapi.dll 對應
//    詳細 XML 操作程式碼極長,核心在於複製現有節點並修改屬性

doc.Save(configPath);

// 5. 重啟 W3SVC
var w3svc = new ServiceController("W3SVC");
w3svc.Start(); w3svc.WaitForStatus(ServiceControllerStatus.Running);

ScriptMaps 範例片段(ASP.NET 2.0)

.asax,C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
.aspx,C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
.ashx,C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
... (其他副檔名同理)

風險提醒

  • 直接編輯 Metabase 繞過 IIS 管理物件,易導致結構不一致。
  • 需高權限(Administrator)且停止服務造成停機。
  • IIS 7+ 已棄用 Metabase,改用 applicationHost.config + Microsoft.Web.Administration API。

現代替代方案

// IIS 7+ 推薦做法
using Microsoft.Web.Administration;
var server = new ServerManager();
var site = server.Sites.Add("MySite", "http", "*:8080:", @"C:\MySite");
site.ApplicationDefaults.ApplicationPoolName = "MyAppPool"; // 設定 .NET CLR 版本
server.CommitChanges();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved