【问题标题】:Get all Sites Defined in ServiceDefinition for Azure获取 ServiceDefinition for Azure 中定义的所有站点
【发布时间】:2012-02-21 01:29:45
【问题描述】:

我们可以在ServiceDefinition.csdef中定义很多站点

我想知道如何通过程序获取列表。我在RoleEnvironment 课堂上玩过,但找不到线索。请帮忙

【问题讨论】:

    标签: azure


    【解决方案1】:

    为了获得最大的兼容性(并且不依赖于可能更改的未记录的实现细节),您应该只使用在本地使用的相同方法。使用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
    }
    

    【讨论】:

    • 是的,你可以检查左边的site.name是不是RoleEnvironment.CurrentRoleInstance.Id来获取所有站点
    【解决方案2】:

    解决方案类似于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 结构并更改您的代码。

    【讨论】:

    • 小心。该文件确实发生了变化,甚至可能消失。文件很有趣,但不会依赖它。
    • 谢谢!并感谢您的回答。当(stackoverflow.com/questions/8497202/…)被问到时你在哪里:)
    • afaik 这部分无法按预期工作:“其中 siteElement.Attribute("name") != null && siteElement.Attribute("name").Value == "Web" && siteElement.Attribute ("physicalDirectory") != null" 当前 SDK 强制所有站点应具有不同的名称,而“Web”只是单个“知名”名称,无需显式的物理目录属性即可处理。
    • 我明确指出“因此,破坏此功能的唯一可能方法是新 SDK 在此文件中引入破坏性更改。”。我很清楚这是 SDK 绑定的方法,我已经表达了。
    • 如果您将 2 个网站放在一个 webrole 中 - 您应该为它使用不同的名称。因此,如果“在哪里”条件至少会失败 2 次,不是吗?失败点: 1. 带有@name="Web" 的站点可能没有指定@physicalDirectory - 它的某种“众所周知”和@physicalDirectory 可以省略。所以“@physicalDirectory!= null”部分将失败。 2. 如果有人将多个站点放置到单个 WebRole - 所有其他站点应该有不同的@name - 因此@name=="Web" 检查将失败。 2 个站点,其中一个名为“web”并省略了 @physDir - 看起来很常见,不是吗?
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多