Samstag , 23 März 2019

Webseitenpfade einer Windows Azure Web Rolle bestimmen

Die Suche nach den WebseitenpfadenIn einem meiner letzten Projekte sollte ein Startup Skript, sowie die Run Methode der RoleEntryPoint Klasse, auf die Webseiten einer Windows Azure Web Rolle zugreifen. Die Herausforderung hierbei bestand in den sich wechselnden Pfaden zu den Webseiten der Rolle. Diese können sich in verschiedenen Situationen, wie z.B. beim Upgrade der bestehenden Cloud Anwendung, ändern.

Genauer gesagt, ändert sich hierbei "nur" der Laufwerksbuchstabe.

Dennoch suchte ich nach einem Weg, der mir alle Webseitenpfade in Form einer Collection wiedergeben kann.

Die Lösung lag in der RoleModel.xml Datei der Web Rolle…

Die RoleModel.xml

Um an eine Auflistung aller Webseiten (inkl. relativer Pfadangabe) zu gelangen, kann die RoleModel.xml Datei verwenden werden.
Diese befindet sich im Stammverzeichnis der Web Rolle, welches über die Umgebungsvariable "RdRoleRoot" abgefragt werden kann.

Bespiel einer RoleModel.xml Datei:

<?xml version="1.0" encoding="utf-8"?>
<RoleModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  name="DemoApp.WebRole" version="1.6.21103.1459" 
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <Runtime>
    <EntryPoint>
      <NetFxEntryPoint assemblyName="DemoApp.WebRole.dll" />
    </EntryPoint>
  </Runtime>
  <Properties>
    <Property name="RoleType" value="Web" />
    <Property name="RoleName" value="DemoApp.WebRole" />
    <Property name="ProjectName" value="DemoApp.WebRole" />
    <Property name="Configuration" value="Release" />
    <Property name="Platform" value="AnyCPU" />
    <Property name="OutputDir" 
              value="C:TFSDemoAppDemoAppobjReleaseDemoApp.WebRole" />
    <Property name="EntryPoint" value="CloudBloggers.WebRole.dll" />
    <Property name="SourceDir" value="C:TFSDemoAppDemoApp.WebRole" />
    <Property name="RoleTargetFramework" value="v3.5" />
    <Property name="SitePhysicalPath" 
              value="C:TFSDemoAppDemoAppobjReleaseDemoApp.WebRole" />
    <Property name="OriginalItemSpec" 
              value="C:TFSDemoAppDemoAppDemoApp.ccproj" />
    <Property name="MSBuildSourceProjectFile" 
              value="C:TFSDemoAppDemoAppDemoApp.ccproj" />
    <Property name="MSBuildSourceTargetName" 
              value="ResolveSingleWebRoleReference" />
    <Property name="TargetFrameworkVersion" value="v3.5" />
    <Property name="TargetRuntimeVersion" value="v2.0" />
  </Properties>
  <Sites>
    <Site name="Web1" physicalDirectory="sitesroot">
      <Bindings>
        <Binding name="Endpoint1" endpointName="Endpoint1" />
      </Bindings>
    </Site>
    <Site name="Web2" physicalDirectory="sitesroot1">
      <Bindings>
        <Binding name="Endpoint1" endpointName="Endpoint1" />
      </Bindings>
    </Site>
  </Sites>
</RoleModel>

 

Das Windows Azure Startup Task

Für das Windows Azure Startup Task, habe ich ein PowerShell Skript verwendet, da ich hierbei, ohne größeren Aufwand, Zugriff auf die Umgebungsvariable, sowie die Daten der XML Datei, erhalte:

$roleRoot = $Env:RdRoleRoot
$roleModelFile = Join-Path $roleRoot "RoleModel.xml"
$roleModel = [xml](Get-Content $roleModelFile)
foreach ($site in $roleModel.RoleModel.Sites.Site)
{
  Write-Output $site.name
  Write-Output $site.physicalDirectory
}

 

Die RoleEntryPoint Klasse

Für die Verwendung innerhalb der RoleEntryPoint Klasse, wurde eine statische Eigenschaft erstellt, die auch hier den Zugriff auf die XML Datei gewährt:

private static IEnumerable<string> WebSiteDirectories
{
  get
  {
    var roleRootDir = Environment.GetEnvironmentVariable("RdRoleRoot");
    if (roleRootDir == null)
      return Enumerable.Empty();
    XNamespace roleModelNs = 
      "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition";
    var roleModelDoc = XDocument.Load(Path.Combine(roleRootDir, "RoleModel.xml"));
    if (roleModelDoc.Root == null)
      return Enumerable.Empty();

    var sites = roleModelDoc.Root.Element(roleModelNs + "Sites");
    if (sites == null)
      return Enumerable.Empty();

    var siteElements = 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(roleRootDir, 
             siteElement.Attribute("physicalDirectory").Value);
  }
}

 


Weitere Informationen Weitere Informationen:


Verwendete Bildquellen:
© Barbara Eckholdt / PIXELIO