كيف يمكنني الحصول على مسار جذر موقع Webrole من robeentrypoint.onstart ()؟

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

  •  30-09-2019
  •  | 
  •  

سؤال

كجزء من بدء تشغيل 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؟

هل كانت مفيدة؟

المحلول

يبدو أن هذا يعمل في كل من 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);

نصائح أخرى

ألق نظرة على:

Environment.GetEnvironmentVariable("RoleRoot")

هل هذا يعطيك ما تبحث عنه؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top