Как я могу получить корневой путь сайта Webrole от RoleentryPoint.Onstart ()?

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

  •  30-09-2019
  •  | 
  •  

Вопрос

В рамках запуска Webrole в Windows Azure, я хотел бы получить доступ к файлам на запуске веб-сайта, и я хотел бы сделать это в роли retentryPoint.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 от ROOLENTRYPOINT.Onstart () таким образом, чтобы работать как в разработке, так и на Azure?

Это было полезно?

Решение

Это, кажется, работает как в разработке, так и в 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, вы должны знать, что файлы, написанные ROOLentrypoint.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);

Другие советы

Взгляни на:

Environment.GetEnvironmentVariable("RoleRoot")

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top