获取在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
以获取所有站点