Comment puis-je obtenir le chemin racine du site WebRole de RoleEntryPoint.OnStart ()?
-
30-09-2019 - |
Question
Dans le cadre de démarrage d'une WebRole sur Windows Azure Je voudrais accéder aux fichiers sur le site en cours de démarrage et je voudrais le faire dans RoleEntryPoint.OnStart (). Cette volonté, par exemple, me permet d'influencer config ASP.NET avant l'ASP.NET AppDomain est chargé.
Lors de l'exécution au niveau local avec Azure SDK 1.3 et VS2010 le code exemple ci-dessous faire l'affaire, mais le code a l'odeur de pirater autour d'elle et ne pas faire l'affaire lors du déploiement d'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;
Comment puis-je obtenir le chemin racine du site WebRole de RoleEntryPoint.OnStart () d'une manière que le travail dans les deux dev et Azure?
La solution
semblent fonctionner dans les deux dev et sur 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);
}
}
Si l'utilisation de quelqu'un ce pour manipuler les fichiers dans l'application ASP.NET, vous devez savoir que les fichiers écrits par RoleEntryPoint.OnStart () auront des paramètres ACL qui empêchent l'application ASP.NET de les mettre à jour.
Si vous devez écrire à ces fichiers de ASP.NET ce code montrent comment vous pouvez modifier les autorisations de fichiers si cela est possible:
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);
Autres conseils
Jetez un oeil à:
Environment.GetEnvironmentVariable("RoleRoot")
Est-ce que vous donner ce que vous cherchez?