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\.

John Bubriski
quelle

Antworten:

294

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

Kein HttpContext erforderlich.

Corbin März
quelle
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 !!

Kiran Banda
quelle
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

tekBlues
quelle
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.

VoltaicShock
quelle
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