【发布时间】:2012-02-21 01:29:45
【问题描述】:
我们可以在ServiceDefinition.csdef中定义很多站点
我想知道如何通过程序获取列表。我在RoleEnvironment 课堂上玩过,但找不到线索。请帮忙
【问题讨论】:
标签: azure
我们可以在ServiceDefinition.csdef中定义很多站点
我想知道如何通过程序获取列表。我在RoleEnvironment 课堂上玩过,但找不到线索。请帮忙
【问题讨论】:
标签: azure
为了获得最大的兼容性(并且不依赖于可能更改的未记录的实现细节),您应该只使用在本地使用的相同方法。使用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来获取所有站点
解决方案类似于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 结构并更改您的代码。
【讨论】: