Получение двух разных значений для одного и того же местоположения с помощью функции GetCurrentDirectory

Я загрузил один проект ASP.Net Core 2.2 MVC. Он работает нормально. Но когда я создал новый проект Asp.Net core 2.2 MVC в своей системе и скопировал весь код из загруженного проекта, одна функция GetCurrentDirectory не работает должным образом.

Я использую код ниже:

Path.Combine(Directory.GetCurrentDirectory(), location, fileName)

Мой проект находится на диске D. В загруженном мной проекте указан правильный путь. Но созданный мной проект показывает путь ниже:

C: \ Program Files \ IIS Express \ data \ people.json

Может ли кто-нибудь помочь мне объяснить, почему это происходит?


person Shardul    schedule 11.01.2019    source источник
comment
Метод GetCurrentDirectory возвращает текущий каталог с точки зрения ОС, а не каталог, из которого был запущен исполняемый файл.   -  person dymanoid    schedule 11.01.2019
comment
Этот код может легко привести к нарушениям безопасности. Если location был введен пользователем, значение, подобное ..\..\..\Windows, будет отображаться в C:\Windows. Проверьте Что эквивалентно Server.MapPath в ASP.NET Core?   -  person Panagiotis Kanavos    schedule 11.01.2019
comment
Почему вы вообще создаете абсолютный путь? Почему бы не загрузить это на этапе настройки с пути, указанного в Content Root?   -  person Panagiotis Kanavos    schedule 11.01.2019


Ответы (1)


При использовании внутрипроцессного хостинга IIS в ASP.NET Core 2.2.0 текущий каталог устанавливается в каталог самого приложения IIS, поэтому в вашем случае при отладке это расположение IIS Express: C:\Program Files\IIS Express

Это поведение будет исправлено в ASP.NET Core 2.2.2, чтобы оно было более интуитивным и соответствовало расположению приложения на диске: https://github.com/aspnet/AspNetCore/pull/6150

person Martin Costello    schedule 11.01.2019
comment
Но я загрузил проект, и если я запускаю этот проект, он показывает мне правильное местоположение моего проекта. - person Shardul; 11.01.2019
comment
Настройки отладки / хостинга в этих двух случаях могут отличаться. Я не могу этого сказать без самого проекта. - person Martin Costello; 11.01.2019
comment
Загляните в .csproj файлы - ваш новый будет содержать <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>, а загруженный - нет. Если вам нужен обходной путь (кроме отключения InProcess), я ответил примерно так: здесь. - person Kirk Larkin; 11.01.2019
comment
InProcess также является значением по умолчанию, поэтому будет использоваться, если значение не было установлено вообще. В качестве альтернативы значение может быть переопределено в Web.config элемента <aspNetCore>. - person Martin Costello; 11.01.2019
comment
Это неправда - _ 1_ по умолчанию. - person Kirk Larkin; 11.01.2019
comment
Ах, я, должно быть, запутался с тем, что изначально планировалось в более ранних превью. - person Martin Costello; 11.01.2019
comment
@kirk ты прав. AspNetCoreHostingModel отсутствует в проекте. Хотите ли вы предложить какое-либо исправление, если режим Inprocess можно оставить как есть? - person Shardul; 11.01.2019
comment
Пока не будет выпущена версия 2.2.2 (как указал здесь Мартин), вам нужно будет использовать обходной путь, показанный в моем ответе, который я привел выше. - person Kirk Larkin; 11.01.2019