Веб-интерфейс Microsoft: как вы работаете с Server.MapPath?
Поскольку Microsoft Web API не MVC, вы не можете сделать что-то вроде этого:
var a = Request.MapPath("~");
ни это
var b = Server.MapPath("~");
потому что они находятся в System.Web
имен System.Web
, а не в System.Web.Http
имен System.Web.Http
.
Так как же определить относительный путь к серверу в Web API?
Я делал что-то подобное в MVC:
var myFile = Request.MapPath("~/Content/pics/" + filename);
Который дал бы мне абсолютный путь на диске:
"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg"
Ответы
Ответ 1
Вы можете использовать HostingEnvironment.MapPath в любом контексте, где HttpContext.Current
объекты System.Web
такие как HttpContext.Current
(например, также из статического метода).
var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");
См. Также Какова разница между Server.MapPath и HostingEnvironment.MapPath?
Ответ 2
string root = HttpContext.Current.Server.MapPath("~/App_Data");
Ответ 3
В дополнение к тем, кто сталкивается с этим, один хороший способ запустить тестовый уровень при использовании вызова HostingEnvironment, если при доступе, скажем, к общему ресурсу UNC:\example \, который сопоставлен с ~/example/, вы можете выполнить это, чтобы обойти Вопросы 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 после запуска.
Ответ 4
Я не могу сказать из контекста, который вы поставляете, но если вам что-то нужно сделать при запуске приложения, вы все равно можете использовать Server.MapPath
в WebApiHttpApplication
; например в Application_Start()
.
Я просто отвечаю на ваш прямой вопрос; возможно, предпочтительным решением является уже упомянутое HostingEnvironment.MapPath()
.
Ответ 5
Поскольку Server.MapPath()
не существует в Web Api (Soap или REST), вам необходимо обозначить local- относительно домашнего каталога веб-сервера context-. Самый простой способ сделать это с помощью:
string AppContext.BaseDirectory { get;}
Затем вы можете использовать это для объединения строки пути для сопоставления относительного пути с любым файлом.
ПРИМЕЧАНИЕ: пути к строкам \
а не /
как в mvc.
Пример:
System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");
возвращает true-, утверждая, что это звуковой путь в вашем примере
Ответ 6
Выбранный ответ не работает в моем приложении веб-API. Мне пришлось использовать
System.Web.HttpRuntime.AppDomainAppPath
Ответ 7
Вы можете попробовать как:
var path = "~/Image/test.png"; System.Web.Hosting.HostingEnvironment.MapPath(@+ путь)