9

作为在 Windows Azure 上启动 WebRole 的一部分,我想访问正在启动的网站上的文件,我想在 RoleEntryPoint.OnStart() 中执行此操作。例如,这将使我能够在加载 ASP.NET AppDomain 之前影响 ASP.NET 配置。

当使用 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;

如何以适用于开发人员和 Azure 的方式从 RoleEntryPoint.OnStart() 获取 WebRole 站点根路径?

4

2 回答 2

12

这似乎在开发人员和 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() 编写的文件将具有阻止 ASP.NET 应用程序更新它们的 ACL 设置。

如果您需要从 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);
于 2010-12-06T03:35:40.220 回答
4

看一眼:

Environment.GetEnvironmentVariable("RoleRoot")

这会给你你想要的东西吗?

于 2010-12-03T13:44:22.823 回答