2010-12-03 4 views
9

Dans le cadre du démarrage d'un WebRole sur Windows Azure, je voudrais accéder aux fichiers sur le site Web en cours de démarrage et je voudrais le faire dans RoleEntryPoint.OnStart(). Cela va par exemple m'autoriser à influencer la configuration ASP.NET avant que le domaine ASP.NET AppDomain soit chargé. Lors de l'exécution locale avec Azure SDK 1.3 et VS2010, l'exemple de code ci-dessous fait l'affaire, mais le code a l'odeur de piratage et ne fait pas l'affaire lors du déploiement sur Azure.Comment puis-je obtenir le chemin racine du site WebRole à partir de RoleEntryPoint.OnStart()?

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 qui fonctionne dans les deux dev et sur Azure?

Répondre

12

Cela semble fonctionner à la fois 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 quelqu'un l'utiliser pour manipuler des fichiers dans l'application ASP.NET, vous devez savoir que les fichiers écrits par RoleEntryPoint.OnStart() aura des paramètres ACL qui empêchent l'application ASP.NET de les mettre à jour.

Si vous devez écrire ces fichiers à partir 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); 
+1

La modification de l'autorisation et/ou la modification des fichiers déployés n'est possible que si vous ajoutez ce au WebRole dans ServiceDefinition.csdef. –

4

Jetez un oeil à:

Environment.GetEnvironmentVariable("RoleRoot") 

Est-ce que vous donner ce que vous cherchez?

+0

Pour votre information, je pense que cela a disparu au SDK 1.5/1.6. – Nariman

+0

Il semble que la constante soit 'RdRoleRoot'. – sharptooth

+0

maintenant il n'y a pas de RdRoleRoot aussi bien. – Amit

Questions connexes