把在找到正確方法前遇到的挫折也拿出來與大家分享,相信不少朋友從iis6到iis7的過渡中也和我存在同樣的疑問,開始的時候我需要在IIS7下創建虛擬目錄,用的是DirecotryEntry這個類,怎么也不能,總會報錯[System.Runtime.InteropServices.COMException]{"未知錯誤(0x80005000)"} 這個錯誤。
private static void TestDirectoryEntry()
{
try
{
string path = "IIsWebService://" + System.Environment.MachineName + "/W3SVC";
System.Collections.ArrayList webSite = new System.Collections.ArrayList();
DirectoryEntry iis = new DirectoryEntry("IIS://localhost/W3SVC");
if (iis != null)
{
foreach (DirectoryEntry entry in iis.Children)
{
if (string.Compare(entry.SchemaClassName, "IIsWebServer") == 0)
{
Console.WriteLine(entry.Name);
Console.WriteLine(entry.Properties["ServerComment"].Value.ToString());
Console.WriteLine(entry.Path);
}
Console.WriteLine();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
第一步,找機子上安全方面的問題。我IIS7是裝在Windows server2008上的。我取消了系統的UAC。並用“以管理員身份”運行的該程序。結果還是不行。
第二步,在網上找有沒有人跟我碰到相同的問題。果然!很多人都有,網上給的解決方案是:
The IIS Metabase and IIS6 Configuration Compatibility is not automatically installed when you enable the Web Server role in Windows 2008 Server. If you enable this feature, your old DirectoryServices code in .NET should work like it used to.
需要安裝 IIS6 Metabase 兼容性組件
用了這種方案果然成功了!但事情並沒有結束。
第三步:找原因,為什么IIS7 不能用這種方法!
功夫不負有心人!
IIS7 是沒有元數據的。哎~~這就是根本原因,大家可以到C:\WINDOWS\system32\inetsrv這個目錄看看,IIS6的和IIS7的文件不同的。
所以后來找到這種方法:
請注意本文的內容均基於Windows Vista Beta 2版本,在正式的發布版本中可能會有所改變。
Microsoft中提供了管理IIS7的一些非常強大的API——Microsoft.Web.Administration,可以很方便的讓我們以編程的方式管理,設定IIS 7的各項配置。Microsoft.Web.Administration.dll位於IIS的目錄(%WinDir%\System32\InetSrv)下,在項目中添加對其的引用后您就可以使用這些API了。下圖顯示了Microsoft.Web.Administration.dll中的主要對象。
讓我們通過幾個例子來使用Microsoft.Web.Administration,下面的例子均非常易懂,我就不再過多解釋了。
建立一個站點(Site)
iisManager.Sites.Add("NewSite", "http", "*:8080:", "d:\\MySite");
iisManager.Update();
將一個應用程序(Application)添加到一個站點
iisManager.Sites["NewSite"].Applications.Add("/Sales", "d:\\MyApp");
iisManager.Update();
建立一個虛擬目錄(Virtual Directory)
Application app = iisManager.Sites["NewSite"].Applications["/Sales"];
app.VirtualDirectories.Add("/VDir", "d:\\MyVDir");
iisManager.Update();
運行時控制:停止一個站點
iisManager.Sites["NewSite"].Stop();
運行時控制:回收應用程序池(Recyciling an Application Pool)
iisManager.ApplicationPools["DefaultAppPool"].Recycle();
運行時控制:得到當前正在處理的請求
foreach(WorkerProcess w3wp in iisManager.WorkerProcesses) {
Console.WriteLine("W3WP ({0})", w3wp.ProcessId);
foreach (Request request in w3wp.GetRequests(0)) {
Console.WriteLine("{0} - {1},{2},{3}",
request.Url,
request.ClientIPAddr,
request.TimeElapsed,
request.TimeInState);
}
}
還有一個有用之處是Microsoft.Web.Administration提供了對*.config(例如web.config)文件的編輯功能,讓您再也不用像修改普通XML文件一樣修改*.config了。但是原作者說他將在今后的Post中詳細說明,我也只暫且寫到這里了。
我的問題從根本解決了,希望能幫助遇到同樣問題的你!