2010-12-03 18 views
9

Como parte de la puesta en marcha de un WebRole en Windows Azure, me gustaría acceder a los archivos en el sitio web que se está iniciando y me gustaría hacer esto en RoleEntryPoint.OnStart(). Esto, por ejemplo, me permitirá influir en la configuración de ASP.NET antes de que se cargue el AppDomain de ASP.NET.¿Cómo puedo obtener la ruta raíz del sitio WebRole desde RoleEntryPoint.OnStart()?

Cuando se ejecuta localmente con Azure SDK 1.3 y VS2010, el código de ejemplo que se muestra a continuación funciona, pero el código tiene el hedor de hackearlo y no funciona cuando se implementa en 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; 

¿Cómo puedo obtener la ruta raíz del sitio WebRole de RoleEntryPoint.OnStart() de una manera que funcione tanto en dev y en Azure?

Respuesta

12

Esto parece funcionar tanto en dev y en 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 alguien usar esto para manipular archivos en la aplicación ASP.NET, usted debe saber que los archivos escritos por RoleEntryPoint.OnStart() tendrá una configuración de ACL que evitará que la aplicación ASP.NET los actualice.

Si necesita escribir en este tipo de archivos de ASP.NET este código muestran cómo puede cambiar los permisos de archivos así que esto es posible:

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

Cambiar el permiso y/o editar los archivos implementados solo es posible si agrega este a WebRole en ServiceDefinition.csdef. –

4

Tome un vistazo a:

Environment.GetEnvironmentVariable("RoleRoot") 

¿Eso le da lo que estás buscando?

+0

FYI, creo que este desapareció a partir del SDK 1.5/1.6. – Nariman

+0

Parece que la constante es 'RdRoleRoot'. – sharptooth

+0

ahora tampoco hay RdRoleRoot. – Amit

Cuestiones relacionadas