2013-05-15 13 views
184

Dal Microsoft Web API non è MVC, non si può fare qualcosa di simile:API Web Microsoft: come si esegue Server.MapPath?

var a = Request.MapPath("~"); 

né questo

var b = Server.MapPath("~"); 

perché questi sono sotto il System.Web spazio dei nomi, non il System.Web.Http namespace .

Quindi, come si determina il percorso del server relativo nell'API Web ?
ho usato per fare qualcosa di simile in MVC:

var myFile = Request.MapPath("~/Content/pics/" + filename); 

Il che mi avrebbe dato il percorso assoluto sul disco:

"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg" 

risposta

365

È possibile utilizzare HostingEnvironment.MapPath in ogni contesto in cui System.Web oggetti come HttpContext.Current sono non disponibile (ad esempio anche da un metodo statico).

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath"); 

Vedi anche What is the difference between Server.MapPath and HostingEnvironment.MapPath?

+0

Questo è bello, ma non c'è modo semplice per deridere HostingEnvironment dal momento che è un'istanza di classe statica ... :-( –

+5

Certo, ma nel tuo controller o altro livello di logica che si desidera test, si impiegherebbe solo una dipendenza dalla propria astrazione, come 'IPathMapper' (probabilmente lo si arrotolerà con una serie di altri problemi in una più grande interfaccia toolbelt/utility) con il metodo' stringa MapPath (string virtualPath) ' Solo l'implementazione concreta per il tuo 'WebApi IPathMapper' deve sapere su' System.Web.Hosting.HostingEnvironment' – StuartLC

+1

@JoshG - puoi astrarre HostingEnvironment.MapPath tramite Func GetWebPath = HostingEnvironment.MapPath e quindi sovrascrivere GetWebPath al momento del test con una simulazione –

1

Non posso dire dal contesto si fornisce, ma se si tratta di qualcosa che hai solo bisogno di fare all'avvio app, è comunque possibile utilizzare Server.MapPath in WebApiHttpApplication; per esempio. in Application_Start().

Sto solo rispondendo alla tua domanda diretta; il già citato HostingEnvironment.MapPath() è probabilmente la soluzione preferita.

9
string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
+10

Non si desidera utilizzare HttpContext.Current in WebAPI. Che dire delle API self-hosted? Non puoi fare affidamento su HttpContext.Current per essere lì. Inoltre non è adatto ai test. –

+0

@TrevordeKoekkoek u r right :) – ArgeKumandan

+0

Non funziona in DNN 7.x –

1

Per inciso a quelli che inciampano lungo in questo, un bel modo al livello di esecuzione di test sull'utilizzo della chiamata HostingEnvironment, è se l'accesso a dire una condivisione UNC: \ esempio \ che è associata a ~/es/si potrebbe eseguire questo per aggirare i problemi IIS-Express:

#if DEBUG 
    var fs = new FileStream(@"\\example\file",FileMode.Open, FileAccess.Read); 
#else 
    var fs = new FileStream(HostingEnvironment.MapPath("~/example/file"), FileMode.Open, FileAccess.Read); 
#endif 

trovo che utile nel caso in cui si dispone di diritti a livello locale di prova su un file, ma hanno bisogno la mappatura ENV una volta in produzione.

+0

Fyi, la classe 'HostingEnvironment' si trova nello spazio dei nomi' System.Web.Hosting'. – Dermot

+2

Qual è l'alternativa a 'HostingEnvironment' per DNX core 5.0? – roydukkey

+0

La nuova classe Startup.cs ora inietta uno Startup pubblico (IHostingEnvironment env) {} per la costruzione, la proprietà mi viene in mente, l'ho fatto solo l'altro giorno. che consente anche di controllare un ambiente per istanza e, utilizzando le direttive #if, è possibile creare un'applicazione in grado di distribuire facilmente il tier in più ambienti. –

-1

La risposta selezionata non ha funzionato nella mia applicazione API Web. Ho dovuto usare

System.Web.HttpRuntime.AppDomainAppPath 
+0

Downvoter, cura di spiegare? – Zoomzoom

Problemi correlati