API Web Microsoft: come si fa Server.MapPath?


239

Poiché l' API Web Microsoft non è MVC , non puoi fare qualcosa del genere:

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

né questo

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

perché questi sono nello System.Webspazio dei nomi, non nello System.Web.Httpspazio dei nomi.

Quindi, come si fa a capire il relativo percorso del server nell'API Web ?
Facevo qualcosa del genere in MVC :

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

Il che mi darebbe il percorso assoluto sul disco:

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

Risposte:


470

Puoi utilizzare HostingEnvironment.MapPath in qualsiasi contesto in cui System.Weboggetti come HttpContext.Currentnon sono disponibili (ad es. Anche da un metodo statico).

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

Vedi anche Qual è la differenza tra Server.MapPath e HostingEnvironment.MapPath?


1
Questo è carino, ma non c'è modo semplice di deridere HostingEnvironment poiché è un'istanza di classe statica ... :-(
Josh G

6
Certo, ma nel controller o in un altro livello logico che si desidera testare, si prenderebbe solo una dipendenza dalla propria astrazione, come IPathMapper(probabilmente lo arrotolerai con un sacco di altre preoccupazioni in una più grande interfaccia toolbelt / utility) con il metodo string MapPath(string virtualPath). Solo l'implementazione concreta per le tue WebApi IPathMapperesigenzeSystem.Web.Hosting.HostingEnvironment
StuartLC,

1
@JoshG - puoi astrarre HostingEnvironment.MapPath tramite Func <stringa, stringa> GetWebPath = HostingEnvironment.MapPath e quindi sovrascrivere GetWebPath al momento del test con una simulazione.
Sean B,

sembra che questo abbia problemi con percorsi relativi come../images/
AaA

Fornisce il percorso del controller, quindi posso ottenere il percorso del servizio utilizzando "HostingEnvironment"?
Md Aslam,

13
string root = HttpContext.Current.Server.MapPath("~/App_Data");

16
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 è test amichevole.
Trevor de Koekkoek,

2

A parte quelli che si imbattono in questo, un buon modo per eseguire il livello di test sull'uso della chiamata HostingEnvironment è se si accede ad esempio una condivisione UNC: \ example \ che è mappato su ~ / example / si potrebbe eseguire questo per aggirare Problemi di 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

Lo trovo utile nel caso in cui tu abbia i diritti di testare localmente su un file, ma hai bisogno del mapping env una volta in produzione.


Cordiali saluti, la HostingEnvironmentclasse è nello System.Web.Hostingspazio dei nomi.
Dermot,

2
Qual è l'alternativa a HostingEnvironment DNX core 5.0?
Roydukkey,

La nuova classe Startup.cs ora inietta una Startup pubblica (IHostingEnvironment env) {} sulla costruzione, la proprietà mi viene in mente, l'ho fatto l'altro giorno. che ti consente di controllare anche un ambiente per istanza e, usando le direttive #if, crea un'app che può essere distribuita facilmente su più livelli in più ambienti.
Nathan Teague,

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.MapPathin WebApiHttpApplication; ad es Application_Start().

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


0

Poiché Server.MapPath()non esiste all'interno di un'API Web (Soap o REST), è necessario indicare il locale relativo alla directory di contesto del server Web. Il modo più semplice per farlo è con:

string AppContext.BaseDirectory { get;}

È quindi possibile utilizzarlo per concatenare una stringa di percorso per mappare il percorso relativo su qualsiasi file.
NOTA: i percorsi delle stringhe sono \e non /come se fossero in mvc.

Ex:

System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");

ritorna vero, supponendo che questo sia un percorso sonoro nel tuo esempio


-1

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

System.Web.HttpRuntime.AppDomainAppPath

1
Anche se sembra che questo sia l'unico modo per ottenere il percorso della tua app WebApi, questo ti dà la radice della tua applicazione ma non traduce percorsi relativi come ~\foldero ../images/in percorsi fisici
AaA,

-1

Puoi provare come:

var path = "~ / Image / test.png"; System.Web.Hosting.HostingEnvironment.MapPath (@ + path)

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.