2012-02-19 14 views
1

所有網站時,我們可以在ServiceDefinition.csdef獲取服務定義定義爲天青

定義很多網站,我想知道如何programely獲取列表。我在RoleEnvironment級玩過,但無法得知。請幫助

回答

3

對於大多數兼容(而不是依靠無證實施細節可以改變),你應該只使用你的處所用同樣的方法。使用Microsoft.Web.Administration組件和ServerManager類。它包含一個包含您需要的所有詳細信息的網站集。

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

是的,你可以檢查左邊的'site.name'是否是'RoleEnvironment.CurrentRoleInstance.Id'來獲取所有網站 – 2012-02-20 20:32:10

3

的解決方案是類似於this question的辦法。

public IEnumerable<string> WebSiteDirectories 
     { 
      get 
      { 
       string roleRootDir = Environment.GetEnvironmentVariable("RdRoleRoot"); 
       string appRootDir = (RoleEnvironment.IsEmulated) ? Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) : roleRootDir; 

       XDocument roleModelDoc = XDocument.Load(Path.Combine(roleRootDir, "RoleModel.xml")); 

       var siteElements = roleModelDoc.Root.Element(_roleModelNs + "Sites").Elements(_roleModelNs + "Site"); 

       return 
        from siteElement in siteElements 
        where siteElement.Attribute("name") != null 
          && siteElement.Attribute("name").Value == "Web" 
          && siteElement.Attribute("physicalDirectory") != null 
        select Path.Combine(appRootDir, siteElement.Attribute("physicalDirectory").Value); 
      } 
     } 

凡_roleModelNs變量的定義如下:

您可以通過類似的東西拿到當地的站點列表

private readonly XNamespace _roleModelNs = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"; 

這會給你的完整路徑。但正如你所看到的,它只是讀取一個XML文件,所以你也可以得到hostHeaders。

爲RoleModel.xml文件被綁定到SDK版本您可以放心地使用這種方法。因此,打破此功能的唯一可能方式是,如果新的SDK引入了對此文件的重大更改。我懷疑發生了什麼。但萬一發生,您可以輕鬆檢查新的XML結構並更改您的代碼。

+0

要小心。這個文件確實會改變,甚至可能會消失。文件很好玩,但不會依賴它。 – dunnry 2012-02-20 17:31:12

+0

謝謝!並感謝您的回答。你在什麼時候(http://stackoverflow.com/questions/8497202/plugin-subdirectory-in-azure-deployment/8501182#8501182)被問到:) – astaykov 2012-02-20 20:57:06

+0

afaik這部分不能按預期工作: 「where siteElement屬性約( 「名稱」)!= NULL && siteElement.Attribute( 「名」)。價值== 「網絡」 && siteElement.Attribute( 「physicalDirectory」)!= NULL」 當前SDK的力量,所有的網站應該有不同的名稱,而「Web」只是一個「知名」名稱,可以在沒有明確的physicalDirectory屬性的情況下處理。 – 2012-03-06 16:37:39