Веб-приложение Blazor (хостинг Linux): путь должен быть абсолютным. (Параметр «корень»)

Текущая настройка

  • Веб-приложение Blazor (интерактивный сервер)
  • Среда выполнения .Net 8
  • Развертывание ZIP в веб-приложении Azure
  • Операционная система веб-приложения Azure — Linux.

Проблема
Итак, после запуска веб-приложения 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.

Вопросы

  • Почему я получаю исключение: путь должен быть абсолютным. (Параметр «root») в веб-приложении, размещенном на Linux?
  • В чем разница между хостингом на Linux и Windows с точки зрения запуска приложения?
  • Если необходимо установить корневой параметр, как мне это сделать?

Используете ли вы сервер nginx для размещения своего приложения?

Abhay Dedkawala 15.08.2024 09:21

Нет, я так не думаю. При создании веб-приложения в Azure я могу выбрать только способ публикации (код), стек среды выполнения (.Net 8), операционную систему (Linux) и регион.

rekcul 15.08.2024 09:25

Эта ошибка может возникнуть из-за того, что папка wwwroot не существует или указан неправильный путь, и вы пытаетесь получить доступ к папке wwwroot.

Abhay Dedkawala 15.08.2024 09:28

Привет @rekcul Почему ты жестко кодируешь C:\home\site\wwwroot для своего WebRootPath? Для Linux нет C: диска.

Jason Pan 15.08.2024 09:29

@rekcul Могу я узнать, как вы развертываете веб-приложение через zip, я напишу для вас руководство ниже, подождите 10 минут.

Jason Pan 15.08.2024 09:30

@JasonPan, это была всего лишь попытка посмотреть, как приложение реагирует на переопределение WebRootPath вручную. Я согласен, C: на самом деле не имеет смысла, но, взглянув на вызванное им исключение, кажется, что WebRootPath добавляется только к существующему пути «/home/site/wwwroot/». Я ожидал, что он полностью заменит путь.

rekcul 15.08.2024 09:32

@AbhayDedkawala, так что он определенно существует в моем решении/csproj. Как я могу гарантировать, что оно существует в веб-приложении в Azure? Как задать правильный путь?

rekcul 15.08.2024 09:34

Я имею в виду, что нам вообще не нужно беспокоиться о пути. Если во время запуска возникла проблема, вероятно, она связана с релизом, поэтому вам необходимо подробно пройти этапы процесса релиза и повторить попытку.

Jason Pan 15.08.2024 09:34

Не могли бы вы поделиться, какие файлы находятся под wwwroot?

Jason Pan 15.08.2024 09:36

@JasonPan Я использую конвейер выпуска Azure Devops, развертывая артефакт веб-приложения blazor (zip), созданный конвейером сборки (на основе yaml).

rekcul 15.08.2024 09:36

Давайте продолжим обсуждение в чате.

Jason Pan 15.08.2024 09:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Выполнив приведенные ниже шаги, мы можем сузить масштаб этой проблемы и выяснить, возникает ли проблема в веб-приложении Azure или в процессе публикации.

Вот подробные шаги.

Шаг 1. Создайте веб-приложение на портале Azure.

Шаг 2. Создайте новое веб-приложение blazor в VS2022.

Шаг 3. Опубликуйте его в папке.

Шаг 4. Сожмите содержимое в zip-файл.

Шаг 5. Откройте инструмент продвижения на портале Azure и добавьте /newui в URL-адрес.

Шаг 6. Перейдите в папку wwwroot и перетащите zip-файл.

Шаг 7. Добавьте команду запуска.

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

Другие вопросы по теме