Microsoft Web API: Jak wykonać Server.MapPath?


239

Ponieważ Microsoft Web API nie jest MVC , nie można zrobić czegoś takiego:

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

ani to

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

ponieważ znajdują się one w obszarze System.Webnazw, a nie w System.Web.Httpobszarze nazw.

Jak zatem ustalić względną ścieżkę serwera w interfejsie API sieci Web ?
Robiłem coś takiego w MVC :

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

Co dałoby mi absolutną ścieżkę na dysku:

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

Odpowiedzi:


470

Możesz użyć HostingEnvironment.MapPath w dowolnym kontekście, w którym System.Webpodobne obiekty HttpContext.Currentnie są dostępne (np. Również z metody statycznej).

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

Zobacz także Jaka jest różnica między Server.MapPath a HostingEnvironment.MapPath?


1
To miłe, ale nie ma łatwego sposobu na kpiny z HostingEnvironment, ponieważ jest to instancja klasy statycznej ... :-(
Josh G

6
Jasne, ale w kontrolerze lub innej warstwie logicznej, którą chcesz przetestować, bierzesz tylko zależność od własnej abstrakcji, np. IPathMapper(Prawdopodobnie zwiniesz to z szeregiem innych problemów w większym interfejsie narzędzi / paska narzędzi) z tą metodą string MapPath(string virtualPath). Tylko konkretne wdrożenie WebApi IPathMapper, o którym System.Web.Hosting.HostingEnvironment
musisz

1
@JoshG - można streścić HostingEnvironment.MapPath za pomocą Func <ciąg, ciąg> GetWebPath = HostingEnvironment.MapPath, a następnie nadpisać GetWebPath w czasie testu z próbą.
Sean B

wygląda na to, że ma problem ze ścieżkami względnymi, takimi jak../images/
AaA

Daje ścieżkę do kontrolera, więc czy mogę uzyskać ścieżkę usługi za pomocą „HostingEnvironment”?
Md Aslam,

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

16
Nie chcesz używać HttpContext.Current w WebAPI. Co z interfejsami API hostowanymi przez siebie? Nie możesz polegać na HttpContext.Current, aby tam być. Również nie jest przyjazny dla testów.
Trevor de Koekkoek

2

Oprócz tych, które się z tym spotykają, jednym fajnym sposobem na uruchomienie poziomu testowego przy użyciu wywołania HostingEnvironment jest dostęp do powiedzmy udziału UNC: \ example \, który jest zamapowany na ~ / example /, możesz to zrobić, aby obejść Problemy z 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 to za pomocne, jeśli masz prawa do lokalnego testowania pliku, ale potrzebujesz mapowania env raz w produkcji.


Fyi, HostingEnvironmentklasa znajduje się w System.Web.Hostingprzestrzeni nazw.
Dermot

2
Jaka jest alternatywa HostingEnvironment dla DNX core 5.0?
roydukkey

Nowa klasa Startup.cs wstrzykuje teraz publiczny startup (IHostingEnvironment env) {} w trakcie budowy, właściwość umyka mi, właśnie zrobiłem to innego dnia. co pozwala również kontrolować środowisko na instancję, a dzięki dyrektywom #if zbudować aplikację, która może łatwo wdrażać na wielu poziomach w wielu środowiskach.
Nathan Teague,

1

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

Odpowiadam tylko na twoje bezpośrednie pytanie; wspomniane już HostingEnvironment.MapPath()jest prawdopodobnie preferowanym rozwiązaniem.


0

Ponieważ Server.MapPath()nie istnieje w interfejsie WWW (Soap lub REST), musisz określić lokalny względem względnego katalogu domowego katalogu kontekstowego serwera WWW. Najłatwiej to zrobić za pomocą:

string AppContext.BaseDirectory { get;}

Następnie można użyć tego do konkatenacji ciągu ścieżki w celu odwzorowania ścieżki względnej na dowolny plik.
UWAGA: ścieżki łańcuchowe są \i nie są/ tak, jak w mvc.

Dawny:

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

zwraca true - zakładając, że jest to ścieżka dźwiękowa w twoim przykładzie


-1

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

System.Web.HttpRuntime.AppDomainAppPath

1
Chociaż wydaje się, że jest to jedyny sposób, aby uzyskać ścieżkę do aplikacji WebApi, daje to katalog główny aplikacji, ale nie tłumaczy ścieżek względnych, takich jak ~\folderlub ../images/ścieżki fizyczne
AaA

-1

Możesz spróbować:

var path = "~ / Image / test.png"; System.Web.Hosting.HostingEnvironment.MapPath (ścieżka +)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.