Wie kann ich Server.MapPath () von global.asax verwenden?


121

Ich muss verwenden Server.MapPath(), um einige Dateipfade zu kombinieren, die ich im speichere web.config.

Da Server.MapPath()ich mich jedoch auf den aktuellen HttpContext stütze (glaube ich), kann ich dies nicht tun. Beim Versuch, die Methode zu verwenden, wird die folgende Ausnahme angezeigt, obwohl sie "verfügbar" ist:

Der Serverbetrieb ist in diesem Zusammenhang nicht verfügbar.

Gibt es eine andere Methode, die ein relatives Webstammverzeichnis wie ~/App_Data/den vollständigen physischen Pfad wie z C:\inetpub\wwwroot\project\App_data\.

Antworten:


294

Sie können System.Web.Hosting.HostingEnvironment.MapPath () ausprobieren .

Kein HttpContext erforderlich.


Irgendwelche Vorbehalte gegen diese Technik?
John Bubriski

10
Nee. Wenn Sie Reflector starten, werden Sie feststellen, dass Server.MapPath und Request.MapPath letztendlich VirtualPath.MapPath aufrufen, das letztendlich HostingEnvironment.MapPath aufruft. Sie landen alle am selben Ort. HostingEnvironment.MapPath schneidet den mittleren Mann aus.
Corbin

1
+1 Dies behebt ein Open Source-Projekt, das für mich funktioniert hat, und hörte dann einfach auf zu initialisieren, da HttpContext.Current.Server explodierte, weil es aus irgendeinem Grund keinen Kontext hatte. Wenn Sie darauf umschalten, können Sie wieder reibungslos segeln.
Chris Marisic

4

Verwenden Sie, AppDomain.CurrentDomain.BaseDirectoryweil Contextmöglicherweise null zurückgegeben wird !!


1

Wenn in Global.asax, verwenden Sie das Kontextobjekt:

context.Server.mappath ()

Mit Kontext können Sie auch auf die Sitzungssammlung, das Anforderungsobjekt und das Antwortobjekt zugreifen. Sehr nützlich, wenn Sie beispielsweise Fehler protokollieren möchten


ContextIn Global.asax gibt es keine Garantie .
Anders Tornblad

-3

Sie könnten HttpContext.Current.Server.MapPath ("/") ausprobieren - so habe ich es zuvor in Klassen referenziert.


2
Sie können in Klassen, die tatsächlich einen HttpContext haben, so darauf verweisen, aber ich glaube nicht, dass global.asax einen hat, daher die Fehlermeldung, die ich erhalten habe.
John Bubriski
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.