Microsoft Web API : Server.MapPath를 어떻게 수행합니까?


239

이후 마이크로 소프트 웹 API가 아닌 MVC , 당신은 이런 식으로 뭔가를 할 수 없습니다

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

이건

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

System.Web네임 스페이스가 아닌 네임 스페이스 아래에 있기 때문 System.Web.Http입니다.

그렇다면 Web API 에서 상대 서버 경로를 어떻게 알 수 있습니까?
나는 MVC 에서 이와 같은 일을했다 .

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

디스크의 절대 경로를 알려줄 것입니다.

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

답변:


470

당신은 사용할 수 있습니다 HostingEnvironment.MapPath을 어떤 맥락에서 System.Web객체가 좋아 HttpContext.Current(정적 방법에서 또한 예를 들어)을 사용할 수 없습니다.

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

Server.MapPath와 HostingEnvironment.MapPath의 차이점은 무엇입니까?를 참조하십시오 .


1
이것은 좋지만 정적 클래스 인스턴스이기 때문에 HostingEnvironment를 조롱하는 쉬운 방법은 없습니다 ... :-(
Josh G

6
물론 컨트롤러 또는 테스트하려는 다른 논리 계층에서는 자신의 추상화에만 의존 IPathMapper할 수 있습니다. (아마도 다른 관심사와 함께 더 큰 툴 벨트 / 유틸리티 인터페이스로 롤업 할 것입니다) 방법으로 string MapPath(string virtualPath). 귀하 WebApi IPathMapper가 알아야 할 구체적인 구현 만System.Web.Hosting.HostingEnvironment
StuartLC

1
@JoshG-Func <string, string> GetWebPath = HostingEnvironment.MapPath를 통해 HostingEnvironment.MapPath를 추상화 한 다음 테스트 시간에 모의로 GetWebPath를 덮어 쓸 수 있습니다.
Sean B

상대 경로에 문제가있는 것 같습니다../images/
AaA

컨트롤러 경로를 제공하므로 "HostingEnvironment"를 사용하여 서비스 경로를 얻을 수 있습니까?
Md Aslam

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

16
WebAPI에서 HttpContext.Current를 사용하고 싶지 않습니다. 자체 호스팅 API는 어떻습니까? HttpContext.Current에 의존 할 수는 없습니다. 또한 테스트 친화적이지 않습니다.
Trevor de Koekkoek

2

이 문제를 우연히 해결하는 사람들을 제외하고 HostingEnvironment 호출을 사용하여 테스트 수준을 실행하는 좋은 방법은 ~ / example /에 매핑 된 UNC 공유에 액세스하는 경우입니다. 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

파일에서 로컬로 테스트 할 권한이 있지만 프로덕션 환경에서 한 번 env 매핑이 필요한 경우 도움이됩니다.


참고로, HostingEnvironment클래스는 System.Web.Hosting네임 스페이스에 있습니다.
Dermot

2
HostingEnvironment DNX core 5.0 의 대안은 무엇입니까 ?
roydukkey

새로운 Startup.cs 클래스는 이제 시공시 공개 Startup (IHostingEnvironment env) {}을 삽입합니다. 속성은 내 마음을 미끄러 뜨 렸습니다. 이를 통해 인스턴스 당 환경을 제어 할 수 있으며 #if 지시문을 사용하면 여러 환경에서 쉽게 계층 간 배포 할 수있는 앱을 빌드 할 수 있습니다.
Nathan Teague

1

나는 당신이 제공 한 상황에서 말할 수 있지만, 당신은 단지 응용 프로그램 시작시 할 필요가 그것의 어떤 경우에, 당신은 여전히 사용할 수 있습니다 Server.MapPathWebApiHttpApplication; 예를 들어 Application_Start().

나는 단지 당신의 직접적인 질문에 대답하고 있습니다; 이미 언급 한 HostingEnvironment.MapPath()것이 아마도 선호되는 솔루션 일 것입니다.


0

이후 Server.MapPath()웹 API 광고 (비누 또는 REST) 내에 존재하지 않습니다, 당신은 웹 서버의 상황에 홈 디렉토리에 로컬 - 상대적인을 표시해야합니다. 가장 쉬운 방법은 다음과 같습니다.

string AppContext.BaseDirectory { get;}

그런 다음이를 사용하여 경로 문자열을 연결하여 상대 경로를 파일에 매핑 할 수 있습니다.
참고 : 문자열 경로는 mvc \와 같지 않습니다 /.

전의:

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

이것이 당신의 예제에서 사운드 경로라는 사실을 리턴합니다.


-1

선택한 답변이 Web API 응용 프로그램에서 작동하지 않았습니다. 나는 사용해야했다

System.Web.HttpRuntime.AppDomainAppPath

1
그것은이 당신이 당신의 WebApi 응용 프로그램에 대한 경로를 얻을 수있는 유일한 방법입니다 보이지만,이 응용 프로그램 당신 루트를 제공하지만, 같은 상대 경로를 번역하지 않습니다 ~\folder또는 ../images/물리적 경로에
AAA

-1

당신은 다음과 같이 시도 할 수 있습니다 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.