获取Azure ServiceDefinition中定义的所有站点

时间:2012-02-19 10:17:09

标签: azure

我们可以在ServiceDefinition.csdef

中定义多个网站

我想知道如何获得列表的程序。我在RoleEnvironment课时玩过,但无法得到线索。请帮忙

2 个答案:

答案 0 :(得分: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结构并更改代码。

答案 1 :(得分:3)

为了获得最大的兼容性(并且不依赖于可以更改的未记录的实现细节),您应该使用在本地使用的相同方法。使用Microsoft.Web.Administration程序集和ServerManager类。它包含一个Sites集合,其中包含您需要的所有详细信息。

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