2013-05-15 7 views
184

Od Microsoft Web API nie jest MVC, nie można zrobić coś takiego:Microsoft Web API: jak zrobić Server.MapPath?

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

ani ten

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

ponieważ są pod nazw System.Web, a nie nazw System.Web.Http .

Jak rozpoznać ścieżkę serwera względnego w Web API?
kiedyś zrobić coś takiego w MVC:

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

co dałoby mi bezwzględną ścieżkę na dysku:

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

Odpowiedz

365

Można wykorzystać HostingEnvironment.MapPath w dowolnym kontekście gdzie System.Web obiektów jak HttpContext.Current są niedostępny (np. również z metody statycznej).

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

Zobacz także What is the difference between Server.MapPath and HostingEnvironment.MapPath?

+0

To jest ładne, ale nie ma łatwego sposobu, aby drwić HostingEnvironment ponieważ jest statyczna instancja klasy ... :-( –

+5

Jasne, ale w kontrolerze lub innej warstwie logiki, które chcesz przetestuj, możesz wziąć tylko zależność od twojej własnej abstrakcji, jak 'IPathMapper' (prawdopodobnie przeniesiesz to z wieloma innymi problemami do większego interfejsu toolbelt/utility) z metodą' string MapPath (string virtualPath) ' Tylko konkretna implementacja twojego 'WebApi IPathMapper' musi wiedzieć o' System.Web.Hosting.HostingEnvironment' – StuartLC

+1

@JoshG - możesz wyhodować HostingEnvironment.MapPath za pośrednictwem Func GetWebPath = HostingEnvironment.MapPath, a następnie nadpisać GetWebPath w czasie testu z próbą –

1

nie mogę powiedzieć z kontekstu przysłanych przez użytkownika, ale jeśli jest to coś po prostu trzeba zrobić przy uruchamianiu aplikacji, można nadal korzystać Server.MapPath w WebApiHttpApplication; na przykład w Application_Start().

Po prostu odpowiadam na twoje bezpośrednie pytanie; wspomniany już HostingEnvironment.MapPath() jest prawdopodobnie preferowanym rozwiązaniem.

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

Nie chcesz używać HttpContext.Current w WebAPI. A co z samohostowanymi interfejsami API? Nie można polegać na HttpContext.Current, aby tam być. Również nie jest przyjazny dla testu. –

+0

@TrevordeKoekkoek u r right :) – ArgeKumandan

+0

Nie działa w DNN 7.x –

1

Tak na marginesie do tych, które potykają się wzdłuż całej to jeden dobry sposób, aby uruchomić poziom testowy za pomocą wywołania HostingEnvironment, to czy dostępu powiedzmy udział UNC: \ Przykład \ który jest mapowany do ~/przykład/można wykonać to, aby ominąć problemy 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 

uważam, że pomocne w przypadku masz prawo do lokalnie testu na pliku, ale trzeba mapowanie env raz w produkcji.

+0

Fyi, klasa 'HostingEnvironment' znajduje się w przestrzeni nazw' System.Web.Hosting'. – Dermot

+2

Jaka jest alternatywa dla 'HostingEnvironment' dla DNX core 5.0? – roydukkey

+0

Nowa klasa Startup.cs teraz Injects Publiczne uruchomienie (IHostingEnvironment env) {} na budowie, własność ześlizguje mi się z umysłu, właśnie zrobiłem to na drugi dzień. , która pozwala również kontrolować środowisko na wystąpienie, a przy użyciu dyrektyw #if można zbudować aplikację, która może współistnieć z wieloma warstwami w wielu środowiskach. –

-1

Wybrana odpowiedź nie działa w mojej aplikacji Web API. Musiałem użyć

System.Web.HttpRuntime.AppDomainAppPath 
+0

Downvoter, czy chcesz wyjaśnić? – Zoomzoom