Ответ 1
Закончил поиск ответа.
Для чтения относительных путей в проекте WebApi необходимо следующее:
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
Вопрос:
У меня есть контроллер WebApi, логический код которого зависит от чтения данных, содержащихся в нескольких файлах XML. Эти XML файлы были включены в папку App_Data
проекта WebApi.
Проблема:
Я пытаюсь использовать относительный путь XML файлов следующим образом:
[System.Web.Http.HttpGet]
public string CallerOne()
{
string docOne = @"~\AppData\DocOne.xml";
string poll = @"~\AppData\Poll.xml";
var response = _Caller.CallService(docOne, poll);
return ConvertXmlToJson(response);
}
При запуске кода WebApi и вызове Url для метода CallerOne
я получаю следующую ошибку:
An exception of type 'System.IO.DirectoryNotFoundException'
occurred in System.Xml.dll but was not handled in user code
Additional information: Could not find a part of the path
'C:\Program Files (x86)\IIS Express\~\AppData\FPS.xml'.
Я также хочу опубликовать это в Azure и включить эти файлы.
Как использовать относительный путь для чтения в файлах XML в папке App_Data
?
Закончил поиск ответа.
Для чтения относительных путей в проекте WebApi необходимо следующее:
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
Как показано в jdweng несколько месяцев назад, Environment.GetEnvironmentVariable( "AppData" ) представляется предпочтительным. Авто-принятый ответ OP и дает совершенно разные результаты. Например, используя оба метода в моем проекте, я получаю:
C:\\Projects\\PlatypusReports\\PlatypusReports\\App_Data\\yourXmlFile.xml
... для длинного кода OP, а именно:
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
... и это:
C:\\Users\\cshannon\\AppData\\Roaming
... для кода jdweng, а именно:
string appData = Environment.GetEnvironmentVariable("AppData");
OTOH, этот код:
string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
возвращает:
C:\\Projects\\PlatypusReports\\PlatypusReports\App_Data\
Таким образом, он очень похож на результаты (если не на методологию) на первый пример выше. Я фактически получил его от вопроса, который я задал почти два года назад, о котором я забыл.
Я не уверен, что если подход jdweng будет работать так, как ожидалось, когда приложение будет развернуто на сервере, но я гораздо увереннее в нем, чем другие подходы.
Может ли кто-нибудь подтвердить?
Принятый ответ здесь имеет 237 upvotes при наборе текста, поэтому кажется довольно надежным, хотя и 6 лет (42 года в собачьих годах, что может быть хорошим знаком).
Твой подход прекрасен. У вас просто была некоторая ошибка, Вы написали
string docOne = @"~\AppData\DocOne.xml";
Но это должно было быть
string docOne = @"~\App_Data\DocOne.xml";