Невозможно загрузить статический файл после его публикации в Azure с использованием ASP.NET Core 2.1 - PullRequest
0 голосов
/ 31 августа 2018

Используя 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, чтобы создать папку таким образом.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Похоже, что ваша проблема в том, что этот файл не публикуется, и это не проблема с тем, что происходит во время выполнения.

Вы, вероятно, увидите такое же поведение, если вы запустите dotnet publish локально, при этом этот файл, вероятно, отсутствует в папке публикации.

Что касается , почему не публикуется, я не эксперт в этой части, но этот ответ может помочь: ASP.NET Core: исключить или включить файлы при публикации

0 голосов
/ 10 января 2019

Для тех, кто сталкивался с этим вопросом, но для .js файлов (или аналогичных), убедитесь, что ваш environment правильно установлен в вашем View.

Пример по умолчанию будет следующим:

<environment exclude="Development">
    <script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>

Где вся работа была выполнена в site.js НЕ site.min.js. В публикации будет использоваться environment, отличающийся от того, в котором вы разрабатываете, и это влияет на ваши результаты.

0 голосов
/ 31 августа 2018

Попробуйте:

XmlDocument doc = new XmlDocument();
doc.Load(_env.ContentRootPath + "\\xml\\file.xml", FileMode.Open);
...