2009-10-31 45 views
49

在我的ASP.NET Web應用程序中,我想查看它在IIS中創建時的名稱,該名稱在服務器中是唯一的。我對網站的域名不感興趣,但是在IIS中給這個網站的實際名稱。從ASP.NET網站獲取IIS站點名稱

我需要能夠做到這一點可靠地IIS6和7

要清楚我說的是在IIS中給定的名稱,而不是域名,而不是虛擬目錄路徑。

Value from IIS I'd like to read from C# http://img252.imageshack.us/img252/6621/capturedz.png

+0

你能否解釋多一點的動機是什麼? – 2009-10-31 16:20:44

+1

我正在爲我編寫的Web應用程序授權,我需要確保每個Web應用程序只使用一次許可證密鑰,即使在同一臺服務器上也是如此。該Web應用程序與分配給IIS站點的多個域名一起工作,因此將該密鑰綁定到該站點的域名不會。 在同樣徒勞的綁定中,機器名稱的關鍵字不會執行任何操作,因爲我的應用程序可能安裝在同一臺機器上的多個客戶機上。 總之,我需要在特定機器上唯一標識IIS網站的內容。由於IIS不允許具有相同名稱的多個站點,我認爲這是要走的路。 – 2009-10-31 16:25:17

+0

我不是故意冒充居高臨下,我只是好奇爲什麼有人會想這樣做。 – 2009-10-31 16:25:41

回答

55
System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 
+0

這正是我一直在尋找。非常感謝。你知道它是否適用於IIS6和7? – 2009-11-02 18:28:34

+0

對不起,我沒有在IIS 6中測試它。 – 2009-11-02 18:47:54

+1

我測試了幾分鐘的IIS 7/5.1,我認爲它適用於IIS 6(90%)。 – 2009-11-02 19:09:48

10

這裏是檢索網站ID related post

這裏是一些代碼,可能會爲你工作:

using System.DirectoryServices; 
using System; 

public class IISAdmin 
{ 
    public static void GetWebsiteID(string websiteName) 
    { 
     DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc"); 

    foreach(DirectoryEntry de in w3svc.Children) 
    { 
     if(de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"][0].ToString() == websiteName) 
     { 
      Console.Write(de.Name); 
     } 

    } 

    } 
    public static void Main() 
    { 
    GetWebsiteID("Default Web Site"); 
    } 

}

這裏的鏈接到original post

我不確定它是否可以在IIS7上工作,但是如果您安裝IIS7的IIS6兼容性組件,它應該可以工作。

9

您正在尋找ServerManagerMicrosoft.Web.Administration),其提供的讀寫訪問IIS 7.0配置系統。

迭代Microsoft.Web.Administration.SiteCollection,使用Site Object獲取對您的網站的引用並讀取Name屬性的值。

// Snippet   
using (ServerManager serverManager = new ServerManager()) { 

var sites = serverManager.Sites; 
foreach (Site site in sites) { 
     Console.WriteLine(site.Name); // This will return the WebSite name 
} 

您還可以使用LINQ查詢ServerManager.Sites集合(見下例)

// Start all stopped WebSites using the power of Linq :) 
var sites = (from site in serverManager.Sites 
      where site.State == ObjectState.Stopped 
      orderby site.Name 
      select site); 

     foreach (Site site in sites) { 
      site.Start(); 
     } 

注意:Microsoft.Web.Administration工作IIS7

對於IIS6,您可以同時使用ADSI和WMI來做到這一點,但我建議您選擇比ADSI更快的WMI。如果使用WMI,請看WMI Code Creator 1.0(由Microsoft開發/免費開發)。它會爲你生成代碼。

HTH

0

連接到遠程服務器時,您需要做的ServerManager.OpenRemote(「服務器名稱」)第一。

基本上做這樣的事情

  using (ServerManager srvMgr = ServerManager.OpenRemote("serverName")) 
      { 

      } 

see msdn help

10

由於@belugabob和@CarlosAg已經提到我寧願使用System.Web.Hosting.HostingEnvironment.SiteName代替System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()因爲IApplicationHost.GetSiteName方法不打算直接調用!(msdn

所以你最好使用HostingEnvironment.SiteName屬性! (msdn

我想這應該是對於文檔正確答案;)

+1

謝謝你指出這一點。在我的情況下System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()的工作,但後來我遇到了一個weired「類型不解析成員」與序列化,我無法追查。切換到HostingEnvironment.SiteName後,它消失了。我認爲它與MarshalByRefObject與序列化不兼容有關。以防萬一有人受到這個打擊,切換到HostingEnvironment.SiteName解決了這個問題。 – 2013-06-30 10:39:39

0

您可以使用下面的代碼

private string WebsiteName() 
{ 
    string websiteName = string.Empty; 
    string AppPath = string.Empty; 
    AppPath = Context.Request.ServerVariables["INSTANCE_META_PATH"]; 
    AppPath = AppPath.Replace("/LM/", "IIS://localhost/"); 
    DirectoryEntry root = new DirectoryEntry(AppPath); 
    websiteName = (string)root.Properties["ServerComment"].Value; 
    return websiteName; 
}