Come posso utilizzare Server.MapPath () da global.asax?


122

Devo utilizzare Server.MapPath()per combinare alcuni percorsi di file che memorizzo in web.config.

Tuttavia, poiché Server.MapPath()si basa sull'attuale HttpContext (credo), non sono in grado di farlo. Quando provo a utilizzare il metodo, anche se è "disponibile", ottengo la seguente eccezione:

Il funzionamento del server non è disponibile in questo contesto.

Esiste un altro metodo in grado di mappare una directory relativa alla radice Web come ~/App_Data/il percorso fisico completo come C:\inetpub\wwwroot\project\App_data\?

Risposte:


295

Potresti provare System.Web.Hosting.HostingEnvironment.MapPath () .

Nessun HttpContext richiesto.


Qualche avvertimento su questa tecnica?
John Bubriski

10
No. Se avvii Reflector, noterai che Server.MapPath e Request.MapPath alla fine chiamano VirtualPath.MapPath che alla fine chiama HostingEnvironment.MapPath. Finiscono tutti nello stesso posto. HostingEnvironment.MapPath elimina l'intermediario.
Corbin marzo

1
+1 questo ha risolto un progetto open source che funzionava per me, quindi ha interrotto l'inizializzazione a causa di HttpContext.Current.Server che è esploso perché non aveva un contesto per qualche motivo. Il passaggio a questo lo riporta a una navigazione tranquilla.
Chris Marisic

4

Usa AppDomain.CurrentDomain.BaseDirectoryperché Contextpotrebbe restituire null !!


1

Quando sei in Global.asax, usa l' oggetto contesto :

context.Server.mappath ()

Il contesto consente di accedere anche alla raccolta di sessioni, all'oggetto richiesta, all'oggetto risposta. Molto utile, ad esempio, quando si desidera registrare errori


Non è garantito Contextin Global.asax.
Anders Tornblad

-3

Potresti provare HttpContext.Current.Server.MapPath ("/"): è così che ci ho fatto riferimento prima nelle classi.


2
Puoi fare riferimento ad esso in questo modo nelle classi che hanno effettivamente un HttpContext, ma non penso che global.asax ne abbia uno, da qui il messaggio di errore che ho ricevuto.
John Bubriski
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.