IIS 6 將設定儲存在 MetaBase.xml。直接修改 XML 可建立網站、設定腳本對應,但需停止 IIS Admin Service,會影響現有網站,生產環境慎用。建議改用 Microsoft.Web.Administration (IIS 7+) 或 DirectoryEntry (ADSI) 非離線操作。
DirectoryEntry("IIS://localhost/W3SVC") 列舉現有站點,取得未使用的 Site ID。IISAdmin 服務及其相依服務(W3SVC 等)。%SystemRoot%\system32\inetsrv\MetaBase.xml,使用 XmlDocument 操作。Location、ServerComment、ServerBindings、Path、ScriptMaps 等屬性。.aspx、.ashx 等對應到 aspnet_isapi.dll v2.0 版本路徑(C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll)。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);
.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
... (其他副檔名同理)
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();