Server.MapPath in ASP.NET core

Der ASP.NET Webforms Entwickler kennt das app_data Verzeichnis als vor Download sicheren Speicherort für Daten einer Website. Um jederzeit den passenden physikalischen  Ordner zu finden nimmt man Server.MapPath. Beides gibt es es in ASP.NET core nicht.

Abhilfe schafft das Directory Objekt.

 

   1:   var pfad = Path.Combine(
   2:              Directory.GetCurrentDirectory(),
   3:              @"\app_data\iis\questions.xml");

Allerdings ist beim deploy auf den IIS, der Pfad plötzlich ein ganz anderer. (Vermutlich Windows/System32). Der Grund liegt darin, das sich Microsoft beim Hosting einer ASP.NET Core Anwendung architektonisch ein wenig verhoben hat. Ausgeführt wird der Code in Kestrel und IIS agiert nur als Proxy.

Eine ASP.NET Core App kann nun In-Process gehostet werden, was die Performance um ein vielfaches steigert. Kleiner Nachteil ist, das für jede Web App ein eigner Application Pool angelegt werden muss.

Aktivieren sie im csproj das Element samt Value InProcess. Das sollte als Standard Wert allerdings vorhanden sein.

   1:  <PropertyGroup>
   2:    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
   3:  </PropertyGroup>

Jetzt zur Pfad Problematik.  Im Startup.cs kommt man in der Configure Methode per env Parameter an den RootPath. Aber nur kurz. Also wird in in die Appdomain ein Key Value abgelegt per SetData. Gelesen wird per GetData.

   1:  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
   2:     {
   3:      ....
   4:      AppDomain.CurrentDomain.SetData("HannesBaseDirectory",
   5:   env.ContentRootPath);

Um nun das Server.MapPath Verhalten wieder herzustellen füge ich noch folgende Klasse ein

   1:  public  class Server
   2:  {
   3:    public static string MapPath(string pfad)
   4:    {
   5:     return Path.Combine(
   6:              AppDomain.CurrentDomain.GetData("HannesBaseDirectory").ToString(),
   7:                  pfad);
   8:   
   9:     }
  10:  }
Kommentare sind geschlossen