Текущая настройка
Проблема
Итак, после запуска веб-приложения Azure я вижу следующее исключение в потоке журнала:
Unhandled exception. System.ArgumentException: The path must be absolute. (Parameter 'root')
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.<>c.<UseStaticWebAssetsCore>b__1_0(String contentRoot)
at Microsoft.AspNetCore.StaticWebAssets.ManifestStaticWebAssetFileProvider..ctor(StaticWebAssetManifest manifest, Func`2 fileProviderFactory)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssetsCore(IWebHostEnvironment environment, Stream manifest)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssets(IWebHostEnvironment environment, IConfiguration configuration)
at Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder.ConfigureAppConfiguration(Action`2 configureDelegate)
at Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions.UseStaticWebAssets(IWebHostBuilder builder)
at MyWebApp.Program.Main(String[] args) in D:\a\1\s\src\MyWebApp\Program.cs:line 28
я добавил строку
builder.WebHost.UseStaticWebAssets();
поскольку это устранило еще одну проблему, с которой я столкнулся раньше, когда веб-приложение не могло загрузить ни один файл из каталога wwwroot.
То, что я уже пробовал
Я попытался установить WebApplicationOptions вручную, указав значение «WebRootPath»:
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
WebRootPath = @"C:\home\site\wwwroot"
});
Идея заключалась в том, чтобы указать корневой путь, поскольку я изучил реализацию UseStaticWebAssets() и увидел, что существует проверка Path.IsPathRooted(root), проверяющая путь, начинающийся с обратной косой черты или имени локального диска (например, C). :). Но это вызвало исключение:
Unhandled exception. System.UnauthorizedAccessException: Access to the path '/home/site/wwwroot/C:\home\site\wwwroot' is denied.
что имеет смысл, поскольку путь абсолютно странный. Я также заметил, что параметр args из основной функции:void Main(string[] args)
пусто. Я не уверен, правильно ли такое поведение, поскольку мы передаем аргументы в качестве параметра в функцию CreateBuilder:var builder = WebApplication.CreateBuilder(args);
Я также опубликовал свое приложение blazor в веб-приложении, размещенном в Windows, и там приложение работает нормально и без каких-либо проблем.
Обновления в комментариях
Мой zip-файл создается в конвейере сборки (на основе файла yaml) и выпускается через конвейер выпуска в Azure Devops.
Моя папка wwwroot содержит только одну таблицу стилей и один файл javascript.
Вопросы
Нет, я так не думаю. При создании веб-приложения в Azure я могу выбрать только способ публикации (код), стек среды выполнения (.Net 8), операционную систему (Linux) и регион.
Эта ошибка может возникнуть из-за того, что папка wwwroot не существует или указан неправильный путь, и вы пытаетесь получить доступ к папке wwwroot.
Привет @rekcul Почему ты жестко кодируешь C:\home\site\wwwroot
для своего WebRootPath? Для Linux нет C:
диска.
@rekcul Могу я узнать, как вы развертываете веб-приложение через zip, я напишу для вас руководство ниже, подождите 10 минут.
@JasonPan, это была всего лишь попытка посмотреть, как приложение реагирует на переопределение WebRootPath вручную. Я согласен, C: на самом деле не имеет смысла, но, взглянув на вызванное им исключение, кажется, что WebRootPath добавляется только к существующему пути «/home/site/wwwroot/». Я ожидал, что он полностью заменит путь.
@AbhayDedkawala, так что он определенно существует в моем решении/csproj. Как я могу гарантировать, что оно существует в веб-приложении в Azure? Как задать правильный путь?
Я имею в виду, что нам вообще не нужно беспокоиться о пути. Если во время запуска возникла проблема, вероятно, она связана с релизом, поэтому вам необходимо подробно пройти этапы процесса релиза и повторить попытку.
Не могли бы вы поделиться, какие файлы находятся под wwwroot?
@JasonPan Я использую конвейер выпуска Azure Devops, развертывая артефакт веб-приложения blazor (zip), созданный конвейером сборки (на основе yaml).
Давайте продолжим обсуждение в чате.
Выполнив приведенные ниже шаги, мы можем сузить масштаб этой проблемы и выяснить, возникает ли проблема в веб-приложении Azure или в процессе публикации.
Вот подробные шаги.
Шаг 1. Создайте веб-приложение на портале Azure.
Шаг 2. Создайте новое веб-приложение blazor в VS2022.
Шаг 3. Опубликуйте его в папке.
Шаг 4. Сожмите содержимое в zip-файл.
Шаг 5. Откройте инструмент продвижения на портале Azure и добавьте /newui
в URL-адрес.
Шаг 6. Перейдите в папку wwwroot и перетащите zip-файл.
Шаг 7. Добавьте команду запуска.
Если после развертывания мы сможем найти содержимое, как показано ниже, это означает, что мы успешно развернули проект.
Используете ли вы сервер nginx для размещения своего приложения?