Используя ASP.NET Core 2.1
, я пытаюсь загрузить тот же статический файл локально на моем компьютере разработчика (через Visual Studio 2017) и после публикации веб-сайта в среде хостинга (Azure Web Apps).
Рассмотрим иерархию каталогов, в которой статический файл (file.xml
), предназначенный для обслуживания, находится внутри корня сети:
wwwroot
css
images
js
xml
file.xml
Вот мой контроллер для загрузки файла:
public class DevelopmentController : Controller
{
private readonly IHostingEnvironment _env;
public DevelopmentController(IHostingEnvironment env)
{
_env = env;
}
public async Task<string> Test()
{
string result = "";
// Test Code Here
XmlDocument doc = new XmlDocument();
doc.Load(Path.Combine(_env.WebRootPath, "xml", "file.xml"));
return result;
}
}
При этом файл загружается локально на моем компьютере разработчика, однако после публикации веб-приложения в Azure я получаю следующую ошибку:
DirectoryNotFoundException: не удалось найти часть пути
'D: \ главная \ сайт \ Wwwroot \ Wwwroot \ XML \ file.xml'
Неважно, что я пытаюсь, я не могу загрузить файл после того, как он был опубликован в Azure.
ПРИМЕЧАНИЕ. В ASP.NET MVC 5
я имел обыкновение использовать функцию Server.MapPath()
для загрузки статического файла, который работал как локально, так и в Azure. Например:
doc.Load(System.Web.HttpContext.Current.Server.MapPath("~/xml/file.xml"));
Но после обновления до ASP.NET Core 2.1
я не могу найти правильный способ сделать это, он также будет работать при размещении на Azure.
Это документы Microsoft, которые я использовал для справки:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.1&tabs=aspnetcore2x
UPDATE
В случае, если кто-то еще испытывает ту же проблему, вот в чем проблема:
Если вы перетащите папку в Solution Explorer
, ссылка не будет автоматически добавлена в файл .csproj
.
Вы можете проверить файл .csproj
, щелкнув правой кнопкой мыши по проекту и выбрав Edit {Project Name}.csproj
. Для любых дополнительных папок, которые вы добавили в каталог wwwroot
, вы должны увидеть что-то вроде:
<ItemGroup>
<Folder Include="wwwroot\myfolder\" />
</ItemGroup>
Если вы этого не видите, он не будет опубликован в Azure.
ПРИМЕЧАНИЕ. Если вы видите <None ...
, то это означает, что папка была настроена на исключение из публикации.
<ItemGroup>
<None Include="wwwroot\myexcludedfolder\"
</ItemGroup>
РЕШЕНИЕ
Я просто удалил папку, которую перетащил, и поместил в Solution Explorer, и вместо этого щелкнул правой кнопкой мыши wwwroot
, чтобы создать папку таким образом.