Как я могу получить корневой путь сайта Webrole от RoleentryPoint.Onstart ()?
-
30-09-2019 - |
Вопрос
В рамках запуска Webrole в Windows Azure, я хотел бы получить доступ к файлам на запуске веб-сайта, и я хотел бы сделать это в роли retentryPoint.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 от ROOLENTRYPOINT.Onstart () таким образом, чтобы работать как в разработке, так и на Azure?
Решение
Это, кажется, работает как в разработке, так и в 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, вы должны знать, что файлы, написанные ROOLentrypoint.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")
Это дает вам то, что вы ищете?