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"
Zachary Scott
źródło

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?

StuartLC
źródło
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");
ArgeKumandan
źródło
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.

Nathan Teague
źródło
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.

taśma klejąca
źródło
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

Gość
źródło
-1

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

System.Web.HttpRuntime.AppDomainAppPath
Przybliżenie przybliżenie
źródło
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 +)

SANDIP G.PATIL
źródło