2010-12-03 3 views
9

Als Teil des Startens einer WebRole auf Windows Azure möchte ich auf Dateien auf der Website zugreifen, die gestartet wird, und ich möchte dies in RoleEntryPoint.OnStart() tun. Dadurch kann ich beispielsweise die ASP.NET-Konfiguration beeinflussen, bevor die ASP.NET AppDomain geladen wird.Wie kann ich den Root-Pfad der WebRole-Site von RoleEntryPoint.OnStart() abrufen?

Wenn Sie lokal mit Azure SDK 1.3 und VS2010 arbeiten, wird der folgende Beispielcode den Zweck erfüllen, aber der Code hat den Gestank des Hacks um ihn herum und es tut nicht den Trick bei der Bereitstellung in 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; 

Wie kann ich den WebRole Website Root-Pfad von RoleEntryPoint.OnStart() in einer Art und Weise erhalten, die sowohl Entwickler und auf Azure arbeiten?

Antwort

12

Dies scheint in beiden Entwicklern und auf Windows Azure zu arbeiten:

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

Wenn jemand diese verwenden, um Dateien in der ASP.NET-Anwendung zu manipulieren, sollen Sie wissen, dass die von RoleEntryPoint.OnStart geschriebenen Dateien() wird über ACL-Einstellungen verfügen, die verhindern, dass die ASP.NET-Anwendung sie aktualisiert.

Wenn Sie solche Dateien von ASP.NET diesen Code Show schreiben müssen, wie Sie Dateiberechtigungen ändern kann, so dies möglich ist:

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

Das Ändern der Berechtigung und/oder das Bearbeiten von bereitgestellten Dateien ist nur möglich, wenn Sie diese der WebRole in ServiceDefinition.csdef hinzufügen. –

4

Werfen Sie einen Blick auf:

Environment.GetEnvironmentVariable("RoleRoot") 

Heißt das, Sie geben, was Sie suchen?

+0

FYI, ich denke, das wie von SDK 1.6 1.5/verschwunden. – Nariman

+0

Es scheint, als ob die Konstante 'RdRoleRoot' ist. – sharptooth

+0

jetzt gibt es auch keinen RdRoleRoot. – Amit

Verwandte Themen