我们可以在ServiceDefinition.csdef
我想知道如何获得列表的程序。我在RoleEnvironment
课时玩过,但无法得到线索。请帮忙
答案 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
}