Как я могу получить корневой путь сайта WebRole от RoleEntryPoint.OnStart()?
В рамках запуска WebRole в Windows Azure я хотел бы получить доступ к файлам на запускаемом веб-сайте и сделать это в RoleEntryPoint.OnStart(). Это, например, позволит мне влиять на конфигурацию ASP.NET до загрузки ASP.NET AppDomain.
При локальном запуске с Azure SDK 1.3 и VS2010 приведенный ниже пример кода добивается цели, но этот код имеет неприятный характер и не работает при развертывании в Azure.
XNamespace srvDefNs = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition";
DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
string roleRoot = di.Parent.Parent.FullName;
XDocument roleModel = XDocument.Load(Path.Combine(roleRoot, "RoleModel.xml"));
var propertyElements = roleModel.Descendants(srvDefNs + "Property");
XElement sitePhysicalPathPropertyElement = propertyElements.Attributes("name").Where(nameAttr => nameAttr.Value == "SitePhysicalPath").Single().Parent;
string pathToWebsite = sitePhysicalPathPropertyElement.Attribute("value").Value;
Как я могу получить корневой путь сайта WebRole из RoleEntryPoint.OnStart () таким образом, чтобы он работал как в dev, так и в Azure?
2 ответа
Кажется, это работает как в dev, так и в Windows Azure:
private IEnumerable<string> WebSiteDirectories
{
get
{
string roleRootDir = Environment.GetEnvironmentVariable("RdRoleRoot");
string appRootDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
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);
}
}
Если кто-то использует это для манипулирования файлами в приложении ASP.NET, вы должны знать, что файлы, написанные RoleEntryPoint.OnStart(), будут иметь настройки ACL, которые не позволяют приложению ASP.NET их обновлять.
Если вам нужно записать в такие файлы из ASP.NET, этот код показывает, как вы можете изменить права доступа к файлам, чтобы это было возможно:
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
IdentityReference act = sid.Translate(typeof(NTAccount));
FileSecurity sec = File.GetAccessControl(testFilePath);
sec.AddAccessRule(new FileSystemAccessRule(act, FileSystemRights.FullControl, AccessControlType.Allow));
File.SetAccessControl(testFilePath, sec);
Взгляни на:
Environment.GetEnvironmentVariable("RoleRoot")
Это дает вам то, что вы ищете?