Как я могу получить корневой путь сайта WebRole от RoleEntryPoint.OnStart ()? - PullRequest
9 голосов
/ 03 декабря 2010

В рамках запуска WebRole в Windows Azure я хотел бы получить доступ к файлам на запускаемом веб-сайте, и я хотел бы сделать это в RoleEntryPoint.OnStart (). Это, например, позволит мне влиять на конфигурацию ASP.NET до загрузки ASP.NET AppDomain.

При локальном запуске с Azure SDK 1.3 и VS2010 приведенный ниже пример кода делает свое дело, но в нем заложен хак, и он не работает при развертывании в 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;

Как я могу получить корневой путь сайта WebRole из RoleEntryPoint.OnStart () таким образом, чтобы он работал как в dev, так и в Azure?

Ответы [ 2 ]

12 голосов
/ 06 декабря 2010

Кажется, это работает как в dev, так и в 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);
    }
}

Если кто-то использует это для манипулирования файлами в приложении ASP.NET, вы должны знать, что файлы, написанные RoleEntryPoint.OnStart (), будут иметь настройки ACL, которые не позволяют приложению ASP.NET обновлять их.

Если вам нужно записать в такие файлы из ASP.NET, этот код покажет, как вы можете изменить права доступа к файлам, чтобы это было возможно:

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);
4 голосов
/ 03 декабря 2010

Взгляните на:

Environment.GetEnvironmentVariable("RoleRoot")

Это дает вам то, что вы ищете?

...