Comment puis-je obtenir le chemin racine du site WebRole de RoleEntryPoint.OnStart ()?

StackOverflow https://stackoverflow.com/questions/4345508

  •  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?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top