¿Cómo puedo obtener la ruta raíz del sitio WebRole de RoleEntryPoint.OnStart ()?

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

  •  30-09-2019
  •  | 
  •  

Pregunta

A medida que se inició parte de la puesta en marcha de un WebRole en Windows Azure que le gustaría acceder a archivos en el sitio web y me gustaría hacer esto en RoleEntryPoint.OnStart (). Esta voluntad, por ejemplo, me permitirá a la influencia de configuración ASP.NET ASP.NET antes de que el dominio de aplicación se carga.

Cuando se ejecuta localmente con Azure SDK 1.3 y VS2010 el código de ejemplo a continuación hacer el truco, pero el código tiene el hedor de corte a su alrededor y no hacer el truco a la hora de desplegar 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 WebRole sitio raíz de RoleEntryPoint.OnStart () de manera que el trabajo tanto en dev y en Azure?

¿Fue útil?

Solución

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 su uso a esta para manipular los archivos de la aplicación ASP.NET, usted debe saber que los archivos escritos por RoleEntryPoint.OnStart () tendrán valores de ACL que impiden la aplicación ASP.NET de su actualización.

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);

Otros consejos

Tome un vistazo a:

Environment.GetEnvironmentVariable("RoleRoot")

¿Eso le da lo que estás buscando?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top