Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取在Azure的ServiceDefinition中定义的所有站点_Azure - Fatal编程技术网

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

获取在Azure的ServiceDefinition中定义的所有站点,azure,Azure,我们可以在ServiceDefinition.csdef 我想知道如何通过程序获取列表。我在RoleEnvironment课上玩过,但找不到线索。请帮助此解决方案类似于的方法 您可以通过以下类似方式获取本地站点列表: public IEnumerable<string> WebSiteDirectories { get { string roleRootDir = Environment.

我们可以在
ServiceDefinition.csdef


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

此解决方案类似于的方法

您可以通过以下类似方式获取本地站点列表:

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);
            }
        }
这将为您提供完整的路径。但是正如您所看到的,它只是读取一个XML文件,所以您也可以获取hostheader


您可以安全地使用这种方法,因为RoleModel.xml文件绑定到SDK版本。因此,破坏此功能的唯一可能方法是,如果新SDK在该文件中引入破坏性更改。我怀疑这会发生。但是,如果发生这种情况,您可以轻松地检查新的XML结构并修改代码。

解决方案类似于

您可以通过以下类似方式获取本地站点列表:

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);
            }
        }
这将为您提供完整的路径。但是正如您所看到的,它只是读取一个XML文件,所以您也可以获取hostheader


您可以安全地使用这种方法,因为RoleModel.xml文件绑定到SDK版本。因此,破坏此功能的唯一可能方法是,如果新SDK在该文件中引入破坏性更改。我怀疑这会发生。但是,如果发生这种情况,您可以轻松地检查新的XML结构并修改代码。

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

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

小心。此文件确实会更改,甚至可能会消失。文件是有趣的闲逛,但不会依赖它。谢谢!谢谢你的回答。问()时您在哪里:)afaik此部分无法按预期工作:“Where-sitelement.Attribute(“name”)!=null&&sitelement.Attribute(“name”).Value==“Web”&&sitelement.Attribute(“physicalDirectory”)!=null”当前SDK强制所有站点都应具有不同的名称,“Web”只是一个“众所周知的”而已可以在没有显式physicalDirectory属性的情况下处理的名称。我明确指出“因此,如果一个新SDK在该文件中引入了破坏性更改,那么破坏此功能的唯一可能方法就是。”。我很清楚,这是SDK绑定的方法,我表达了它。如果你把两个网站放在一个webrole中,你应该有不同的名称。如果“where”条件至少失败2次,不是吗?失败点:1。带有@name=“Web”的站点不能指定@physicalDirectory-它的某种“众所周知”和@physicalDirectory可以被复制。因此“@physicalDirectory!=null”部分将失败。2.如果任何人将多个站点放在一个WebRole中-所有其他站点都应该有不同的@name-因此@name==“Web”检查将失败。两个站点中有一个名为“web”和ommited@physDir-看起来很常见,不是吗?小心点。此文件确实会更改,甚至可能会消失。文件是有趣的闲逛,但不会依赖它。谢谢!谢谢你的回答。问()时您在哪里:)afaik此部分无法按预期工作:“Where-sitelement.Attribute(“name”)!=null&&sitelement.Attribute(“name”).Value==“Web”&&sitelement.Attribute(“physicalDirectory”)!=null”当前SDK强制所有站点都应具有不同的名称,“Web”只是一个“众所周知的”而已可以在没有显式physicalDirectory属性的情况下处理的名称。我明确指出“因此,如果一个新SDK在该文件中引入了破坏性更改,那么破坏此功能的唯一可能方法就是。”。我很清楚,这是SDK绑定的方法,我表达了它。如果你把两个网站放在一个webrole中,你应该有不同的名称。如果“where”条件至少失败2次,不是吗?失败点:1。带有@name=“Web”的站点不能指定@physicalDirectory-它的某种“众所周知”和@physicalDirectory可以被复制。因此“@physicalDirectory!=null”部分将失败。2.如果任何人将多个站点放在一个WebRole中-所有其他站点都应该有不同的@name-因此@name==“Web”检查将失败。两个站点,其中一个名为“web”和ommited@physDir-看起来很常见,不是吗?是的,您可以检查左侧的
站点。name
是否为
RoleEnvironment.CurrentRoleInstance.Id
若要获取所有站点,您可以检查左侧的
站点。name
是否为
RoleEnvironment.CurrentRoleInstance.Id
以获取所有站点