Веб-API Microsoft: Як зробити Server.MapPath?


239

Оскільки веб-API Microsoft не є MVC , ви не можете зробити щось подібне:

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

ні це

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

тому що вони знаходяться під System.Webпростором імен, а не в System.Web.Httpпросторі імен.

Тож як ви з'ясуєте відносний шлях до сервера у веб-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 - ви можете абстрагувати HostingEnvironment.MapPath через Func <string, string> GetWebPath = HostingEnvironment.MapPath, а потім замінити GetWebPath в тестовий час з макетом.
Шон Б

схоже, що це проблеми з відносними шляхами на кшталт../images/
AaA

Це дає шлях до контролера, тож чи можу я отримати службовий шлях за допомогою "HostingEnvironment"?
Md Aslam

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

16
Ви не хочете використовувати HttpContext.Current у WebAPI. А як щодо власних API? Ви не можете покластися на HttpContext.Current, щоб бути там. Також це не є тестовим дружнім.
Тревор де Коеккьок

2

Окрім тих, хто натрапляє на це, один приємний спосіб запустити тестовий рівень за допомогою виклику 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-картування один раз у виробництві.


Fyi, HostingEnvironmentклас знаходиться в System.Web.Hostingпросторі імен.
Дермот

2
Яка альтернатива HostingEnvironment для DNX core 5.0?
roydukkey

Новий клас Startup.cs тепер ін'єктує загальнодоступний запуск (IHostingEnvironment env) {} на будівництві, властивість прослідковує мою думку, саме це зробив днями. що дозволяє також керувати оточуючим середовищем, наприклад, за допомогою директив #if створити додаток, який може легко переходити рівень ярусу в різних середовищах.
Натан Тейг

1

Я не можу сказати з контексту ви ставите, але якщо це те , що вам просто потрібно зробити під час запуску програми, ви можете використовувати Server.MapPathв WebApiHttpApplication; наприклад в Application_Start().

Я просто відповідаю на ваше пряме запитання; вже згаданийHostingEnvironment.MapPath() , мабуть, є кращим рішенням.


0

Оскільки Server.MapPath()він не існує в Web Api (Soap або REST), вам потрібно буде позначити локальний відносно контекстного домашнього каталогу веб-сервера. Найпростіший спосіб зробити це за допомогою:

string AppContext.BaseDirectory { get;}

Потім ви можете використовувати це для об'єднання рядка шляху для відображення відносного шляху до будь-якого файлу.
ПРИМІТКА: шляхові рядки є \і не /такі, як вони є у mvc.

Наприклад:

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

повертає true - уважаючи, що це звуковий шлях у вашому прикладі


-1

Вибрана відповідь не працювала в моєму додатку Web API. Мені довелося користуватися

System.Web.HttpRuntime.AppDomainAppPath

1
Хоча здається, що це єдиний спосіб отримати шлях до вашої програми WebApi, це дає корінь вашої програми, але не переводить відносні шляхи, такі як фізичні, ~\folderабо ../images/фізичні шляхи
AaA

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.