WebApi - Как включить относительные пути для входящих XML файлов App_Data?

Вопрос:

У меня есть контроллер 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?

Ответы

Ответ 1

Закончил поиск ответа.

Для чтения относительных путей в проекте WebApi необходимо следующее:

var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");

Ответ 2

Как показано в 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 будет работать так, как ожидалось, когда приложение будет развернуто на сервере, но я гораздо увереннее в нем, чем другие подходы.

Может ли кто-нибудь подтвердить?

UPDATE

Принятый ответ здесь имеет 237 upvotes при наборе текста, поэтому кажется довольно надежным, хотя и 6 лет (42 года в собачьих годах, что может быть хорошим знаком).

Ответ 3

Твой подход прекрасен. У вас просто была некоторая ошибка, Вы написали

string docOne = @"~\AppData\DocOne.xml";

Но это должно было быть

string docOne = @"~\App_Data\DocOne.xml";