2013-05-15 6 views
184

Da Microsoft-API ist nicht MVC, Sie nicht so etwas tun kann:Microsoft Web API: Wie machst du einen Server.MapPath?

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

noch diese

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

, weil diese unter dem System.Web Namespace, nicht der System.Web.Http Namespace . Wie finden Sie den relativen Serverpfad in Web API?
habe ich so etwas wie dies in MVC zu tun:

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

Antwort

365

Sie HostingEnvironment.MapPath können in jedem Kontext, in dem System.Web Objekte wie HttpContext.Current sind:

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

Was mir den absoluten Pfad auf der Festplatte geben würde, nicht verfügbar (z. B. auch von einer statischen Methode).

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

Siehe auch What is the difference between Server.MapPath and HostingEnvironment.MapPath?

+0

Das ist schön zu verwenden, aber es gibt keinen einfachen Weg, Hostingenvironment zu verspotten, da es sich um eine statische Klasseninstanz ist ... :-( –

+5

Sicher, aber in Ihrem Controller oder eine andere Logik-Schicht, die Sie wollen test, würden Sie nur eine Abhängigkeit von Ihrer eigenen Abstraktion nehmen, wie 'IPathMapper' (Sie werden dies wahrscheinlich mit einer Menge anderer Bedenken in eine größere Toolbelt/Utility-Schnittstelle aufrollen) mit der Methode' string MapPath (string virtualPath) ' Nur die konkrete Implementierung für Ihren 'WebApi IPathMapper' muss über' System.Web.Hosting.HostingEnvironment' bekannt sein. – StuartLC

+1

@JoshG - Sie können HostingEnvironment.MapPath über Func GetWebPath = HostingEnvironment.MapPath abstrahieren und dann GetWebPath überschreiben zur Testzeit mit einem Schein –

1

Ich kann nicht aus dem Zusammenhang sagen Sie liefern, aber wenn es etwas ist, brauchen Sie nur bei App Startup zu tun, können Sie immer noch Server.MapPath in WebApiHttpApplication verwenden; z.B. in Application_Start().

Ich beantworte nur Ihre direkte Frage; die bereits erwähnte HostingEnvironment.MapPath() ist wahrscheinlich die bevorzugte Lösung.

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

Sie möchten HttpContext.Current in WebAPI nicht verwenden. Was ist mit selbst gehosteten APIs? Sie können sich nicht darauf verlassen, dass HttpContext.Current dort ist. Auch ist es nicht testfreundlich. –

+0

@TrevordeKoekkoek du hast Recht :) – ArgeKumandan

+0

Funktioniert nicht in DNN 7.x –

1

Als Nebenwirkung zu denjenigen, die sich über diese stolpern entlang, ein schöner Weg, Prüfpegels zur Verwendung des Hostingenvironment Anruf ausgeführt werden soll, wenn sagen wir einen Anteil UNC Zugriff: \ Beispiel \ dass auf ~/example abgebildet/Sie könnte dies ausführen um Probleme IIS-Express zu erhalten:

#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 

ich finde, dass hilfreich, wenn Sie die Rechte auf lokal-Test auf eine Datei haben, aber das env-Mapping einmal in der Produktion benötigen.

+0

Fyi, die 'HostingEnvironment' Klasse befindet sich im' System.Web.Hosting' Namensraum. – Dermot

+2

Was ist die Alternative zu 'HostingEnvironment' für DNX Core 5.0? – roydukkey

+0

Die neue Startup.cs-Klasse injiziert jetzt ein öffentlichen Startup (IHostingEnvironment env) {} auf den Bau, die Eigenschaft rutscht mir durch den Kopf, tat dies gerade neulich. , mit dem Sie auch eine Umgebung pro Instanz steuern können, und mithilfe von #if-Direktiven eine App erstellen, die die Tier-Bereitstellung in mehreren Umgebungen problemlos durchführen kann. –

-1

Die ausgewählte Antwort funktionierte nicht in meiner Web-API-Anwendung. Ich hatte

System.Web.HttpRuntime.AppDomainAppPath 
+0

Downvoter, vorsichtig erklären? – Zoomzoom

Verwandte Themen