Хостинг и развертывание ASP.NET Core Blazor WebAssembly

Note

Это не последняя версия этой статьи. Текущий выпуск можно найти в версии этой статьи о .NET 10.

Warning

Эта версия ASP.NET Core больше не поддерживается. Для получения дополнительной информации см. Политику поддержки .NET и .NET Core. Текущий выпуск можно найти в версии этой статьи о .NET 10.

В этой статье объясняется, как размещать и развертывать Blazor WebAssembly приложения.

При использовании модели хостинга Blazor WebAssembly:

  • Приложение Blazor, его зависимости и среда выполнения .NET загружаются в браузер параллельно.
  • Приложение выполняется непосредственно в потоке пользовательского интерфейса браузера.

Эта статья относится к сценарию развертывания, в котором приложение Blazor размещено на статическом веб-сервере или службе размещения, .NET не используется для обслуживания приложения Blazor. Эта стратегия рассматривается в разделе Standalone deployment и других статьях этого раздела для служб IIS, Azure, Apache, Nginx и GitHub Pages.

Поддерживаются следующие стратегии развертывания:

  • Приложение Blazor обслуживается приложением ASP.NET Core. Эта стратегия рассматривается в разделе Hosted deployment with ASP.NET Core.
  • Приложение Blazor помещается на статический веб-сервер или службу размещения, где .NET не используется для обслуживания приложения Blazor. Эта стратегия рассматривается в разделе Автономное развертывание, где приводятся сведения о размещении приложения Blazor WebAssembly в качестве дочернего приложения IIS.
  • Приложение ASP.NET Core размещает несколько приложений Blazor WebAssembly. Дополнительные сведения см. в разделе несколько размещенных ASP.NET Core Blazor WebAssembly приложений.

Blazor WebAssembly Локальное обслуживание приложения для тестирования

Многие серверы с открытым исходным кодом и коммерческими HTTP-серверами могут обслуживать опубликованное Blazor WebAssembly приложение локально. Для простого HTTP-сервера командной строки рекомендуется использовать средство natemcmaster/dotnet-serve .NET.

Warning

Средство natemcmaster/dotnet-serve .NET не принадлежит Майкрософт и не распространяется ни на какое соглашение о поддержке или лицензию Майкрософт. Используйте осторожность при использовании стороннего средства, особенно для тестирования сценариев безопасности. Убедитесь, что средство соответствует официальным спецификациям и принимает рекомендации по обеспечению безопасности. Сохраните текущую версию средства, чтобы получить последние исправления ошибок.

Размещение поддомена и подприложения IIS

Для размещения поддомена не требуется специальная конфигурация приложения. Вам не нужно настраивать базовый путь приложения (тег <base> в wwwroot/index.html) для размещения приложения в поддомене.

Для размещения подприложений IIS действительно требуется установить базовый путь приложения. Дополнительные сведения и перекрестные ссылки на дополнительные рекомендации по размещению вложенных приложений IIS см. в разделе Host и развертывание ASP.NET Core Blazor.

Уменьшение максимального размера кучи для некоторых браузеров мобильных устройств

При создании Blazor приложения, работающего .Client на клиенте (Blazor Web App проекте или автономном Blazor WebAssembly приложении) и предназначенного для браузеров мобильных устройств, особенно Safari на iOS, может потребоваться снизить максимальный объём памяти приложения с помощью свойства EmccMaximumHeapSize MSBuild. Значение по умолчанию — 2 147 483 648 байт, которое может быть слишком большим и привести к сбою приложения, если оно попытается выделить больше памяти, а браузер откажется её предоставить. В следующем примере значение устанавливается на 268 435 456 байт в файле Program:

При создании приложения, предназначенного для браузеров мобильных устройств, особенно Safari на iOS, возможно, потребуется уменьшить максимальную память для приложения с использованием свойства MSBuild Blazor WebAssembly. Значение по умолчанию — 2 147 483 648 байт, которое может быть слишком большим и привести к сбою приложения, если оно попытается выделить больше памяти, а браузер откажется её предоставить. В следующем примере значение устанавливается на 268 435 456 байт в файле Program:

<EmccMaximumHeapSize>268435456</EmccMaximumHeapSize>

Дополнительные сведения о свойствах и целях MSBuild для Mono/WebAssembly см. в разделе (репозиторий на GitHub).

Формат упаковки Webcil для сборок .NET

Webcil — это удобный для интернета формат упаковки для сборок .NET, предназначенных для использования Blazor WebAssembly в ограничивающих сетевых средах. Файлы Webcil используют стандартную оболочку WebAssembly, где сборки развертываются как файлы WebAssembly, использующие стандартное .wasm расширение файла.

Webcil — это формат упаковки по умолчанию при публикации Blazor WebAssembly приложения. Чтобы отключить использование Webcil, задайте в файле проекта приложения следующее свойство MSBuild:

<PropertyGroup>
  <WasmEnableWebcil>false</WasmEnableWebcil>
</PropertyGroup>

Настройка способа загрузки загрузочных ресурсов

Настройте способ загрузки загрузочных ресурсов с помощью API loadBootResource. Дополнительные сведения см. в разделе ASP.NET Core Blazor startup.

Compression

При публикации приложения Blazor WebAssembly выходные данные статически сжимаются, чтобы уменьшить размер приложения и исключить издержки на сжатие среды выполнения. Используются следующие алгоритмы сжатия:

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

Blazor полагается на хост для предоставления соответствующих сжатых файлов. При использовании проекта ASP.NET Core HostedBlazor WebAssembly, главный проект может выполнять согласование содержимого и обслуживать статически сжатые файлы. При размещении автономного приложения Blazor WebAssembly, возможно, потребуется реализовать дополнительные действия для обслуживания статически сжатых файлов.

  • Сведения о конфигурации сжатия IIS web.config см. в разделе IIS: сжатие Brotli и Gzip.
  • При размещении на статических сервисах хостинга, которые не поддерживают переговоры о содержимом для статически сжатых файлов, рассмотрите возможность настройки приложения для извлечения и декодирования сжатых файлов Brotli.

Получите декодатор JavaScript Brotli из репозитория google/brotli GitHub. Сокращенный файл декодера называется decode.min.js и находится в папке js репозитория.

Note

Если сокращенная версия скрипта decode.js (decode.min.js) не работает, попробуйте вместо нее использовать не сокращенную версию (decode.js).

обновите приложение для использования декодера.

В файле wwwroot/index.html установите для autostart значение false в теге Blazor элемента <script>:

<script src="_framework/blazor.webassembly.js" autostart="false"></script>

После тега Blazor<script> и перед закрывающим тегом </body> добавьте следующий блок JavaScript-кода <script>. Следующая функция вызывает fetch с cache: 'no-cache' для обновления кэша браузера.

Blazor Web App:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    webAssembly: {
      loadBootResource: function (type, name, defaultUri, integrity) {
        if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration' && type !== 'manifest') {
          return (async function () {
            const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
            if (!response.ok) {
              throw new Error(response.statusText);
            }
            const originalResponseBuffer = await response.arrayBuffer();
            const originalResponseArray = new Int8Array(originalResponseBuffer);
            const decompressedResponseArray = BrotliDecode(originalResponseArray);
            const contentType = type === 
              'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
            return new Response(decompressedResponseArray, 
              { headers: { 'content-type': contentType } });
          })();
        }
      }
    }
  });
</script>

Самостоятельное Blazor WebAssembly:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    loadBootResource: function (type, name, defaultUri, integrity) {
      if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration') {
        return (async function () {
          const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
          if (!response.ok) {
            throw new Error(response.statusText);
          }
          const originalResponseBuffer = await response.arrayBuffer();
          const originalResponseArray = new Int8Array(originalResponseBuffer);
          const decompressedResponseArray = BrotliDecode(originalResponseArray);
          const contentType = type === 
            'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
          return new Response(decompressedResponseArray, 
            { headers: { 'content-type': contentType } });
        })();
      }
    }
  });
</script>

Дополнительные сведения о загрузке загрузочных ресурсов см. в разделе ASP.NET Core Blazor startup.

Чтобы отключить сжатие, добавьте свойство CompressionEnabled MSBuild в файл проекта приложения и задайте для него значение false.

<PropertyGroup>
  <CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>

Свойство CompressionEnabled можно передать в команду dotnet publish с помощью следующего синтаксиса в командной оболочке.

dotnet publish -p:CompressionEnabled=false

Чтобы отключить сжатие, добавьте свойство BlazorEnableCompression MSBuild в файл проекта приложения и задайте для него значение false.

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

Свойство BlazorEnableCompression можно передать в команду dotnet publish с помощью следующего синтаксиса в командной оболочке.

dotnet publish -p:BlazorEnableCompression=false

Переписывание URL-адресов для правильной маршрутизации

Запросы маршрутизации для компонентов страниц в Blazor WebAssembly приложении не так просто, как запросы маршрутизации в Blazor Server приложении. Рассмотрим сценарий с приложением Blazor WebAssembly с двумя компонентами:

  • Main.razor: загружается в корне приложения и содержит ссылку на About компонент (href="About").
  • About.razor: компонент About.

При запросе документа приложения по умолчанию в адресной строке браузера (например, https://www.contoso.com/):

  1. Браузер отправляет запрос.
  2. Возвращается страница по умолчанию; обычно это index.html.
  3. Страница index.html обеспечивает начальную загрузку приложения.
  4. Router компонент загружается, а RazorMain компонент отрисовывается.

На странице Main возможность выбора ссылки на компонент About доступна на клиентском компьютере, так как маршрутизатор Blazor не разрешает браузеру сделать запрос в Интернете к www.contoso.com для About и сам обрабатывает отображенный компонент About. Все запросы внутренних конечных точек в приложении работают одинаково: запросы через браузер не активируют запросы к размещенным на сервере ресурсам в Интернете. Маршрутизатор обрабатывает запросы внутренним образом.

Если запрос www.contoso.com/About сделан с помощью адресной строки браузера, он завершится ошибкой. Такой ресурс не существует на интернет-узле приложения, поэтому возвращается ответ 404 — Not Found (не найдено).

Поскольку браузеры выполняют запросы к интернет-узлам для клиентских страниц, веб-серверам и службам хостинга необходимо переписывать все запросы к ресурсам, которые физически отсутствуют на сервере, на страницу index.html. Когда возвращается index.html, маршрутизатор Blazor приложения принимает управление и отвечает нужным ресурсом.

При развертывании на сервере IIS можно использовать модуль переопределения URL-адресов с опубликованным файлом web.config приложения. Дополнительные сведения см. в статье Host и развертывание ASP.NET Core Blazor WebAssembly с помощью IIS.

Размещенное развертывание с ASP.NET Core

Развертывание hosted обеспечивает доставку приложения Blazor WebAssembly браузерам из приложения ASP.NET Core, работающего на веб-сервере.

Клиентское приложение Blazor WebAssembly будет опубликовано в папку /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot серверного приложения вместе со статическими веб-ресурсами серверного приложения. Оба приложения развертываются вместе. Требуется веб-сервер, способный размещать приложение ASP.NET Core. Для хостингового развертывания Visual Studio включает шаблон Blazor WebAssembly App для проекта (шаблон blazorwasm при использовании команды dotnet new) с выбранной опцией Hosted (-ho|--hosted при использовании команды dotnet new).

Дополнительные сведения см. в следующих статьях:

Размещенное развертывание исполняемого файла, зависящего от среды выполнения для определенной платформы

Чтобы развернуть размещенное приложение Blazor WebAssembly в качестве исполняемого файла, зависящего от среды выполнения для определенной платформы (не автономной), используйте следующие рекомендации на основе используемых инструментов.

Visual Studio

Автономное развёртывание настроено для сгенерированного профиля публикации.pubxml. Убедитесь, что профиль публикации проекта Server содержит свойство MSBuild <SelfContained>, которому присвоено значение false.

В файле профиля публикации .pubxml в папке Server проекта Properties выполните следующие действия:

<SelfContained>false</SelfContained>

Задайте Идентификатор среды выполнения (RID) с помощью параметра Целевая среда выполнения в области Параметры пользовательского интерфейса Публикация, который создает свойство MSBuild <RuntimeIdentifier> в профиле публикации:

<RuntimeIdentifier>{RID}</RuntimeIdentifier>

В предыдущей конфигурации заполнитель {RID} представляет собой Идентификатор среды выполнения (RID).

Опубликуйте проект Server в конфигурации Выпуск.

Note

Можно опубликовать приложение с параметрами профиля публикации с помощью интерфейса командной строки .NET, передав /p:PublishProfile={PROFILE} в команду dotnet publish, где плейсхолдер {PROFILE} является профилем. Дополнительные сведения см. в разделах Профили публикации и Пример публикации папки в статье Профили публикации Visual Studio (.pubxml) для развертывания приложений ASP.NET Core. Если вы передаете RID в команде dotnet publish, а не в профиле публикации, используйте свойство MSBuild (/p:RuntimeIdentifier) с командой, а не с -r|--runtime параметром.

интерфейс командной строки .NET

Настройте автономное развертывание, указав свойство MSBuild <SelfContained> в секции <PropertyGroup> файла проекта Server, установив его значение на false:

<SelfContained>false</SelfContained>

Important

Свойство SelfContained должно быть помещено в файл проекта Server. Свойство не может быть корректно задано с помощью команды dotnet publish при использовании параметра --no-self-contained или свойства MSBuild /p:SelfContained=false.

Задайте Идентификатор среды выполнения (RID), используя любой из указанных ниже подходов:

  • Вариант 1. Задайте RID в разделе <PropertyGroup> в файле проекта Server:

    <RuntimeIdentifier>{RID}</RuntimeIdentifier>
    

    В предыдущей конфигурации заполнитель {RID} представляет собой Идентификатор среды выполнения (RID).

    Опубликуйте приложение в конфигурации Release из проекта Server.

    dotnet publish -c Release
    
  • Вариант 2: Передайте RID в команде dotnet publish в качестве свойства MSBuild (/p:RuntimeIdentifier), а не с параметром -r|--runtime:

    dotnet publish -c Release /p:RuntimeIdentifier={RID}
    

    В предыдущей команде заполнитель {RID} представляет собой Идентификатор среды выполнения (RID).

Дополнительные сведения см. в следующих статьях:

Автономное развертывание

Автономное развертывание обрабатывает приложение Blazor WebAssembly как набор статических файлов, которые будут запрашиваться непосредственно клиентами. Любой статический файловый сервер способен обслуживать приложение Blazor.

Автономные ресурсы развертывания публикуются в папке /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot или bin/Release/{TARGET FRAMEWORK}/browser-wasm/publish, где {TARGET FRAMEWORK} является целевой платформой.

Публикация без HTML-документа

Если приложение не использует HTML-документ, созданный в рамках процесса сборки и публикации .NET, негде разместить карту импорта. Например, этот сценарий возникает при публикации автономного Blazor приложения для использования приложением JavaScript/SPA через Blazor пользовательский элемент.

Чтобы избежать проблем с загрузкой ресурсов приложения на клиенте, отключите фингерпринтинг для и blazor.webassembly.js путем удаления свойства dotnet.js MSBuild (или установите его в значение <OverrideHtmlAssetPlaceholders>) в файле проекта приложения (false).

Служба приложений Azure

приложения Blazor WebAssembly можно развернуть в службах приложений Azure в Windows, где приложение размещается на IIS.

Развертывание автономного приложения Blazor WebAssembly в Служба приложений Azure для Linux в настоящее время не поддерживается. Мы рекомендуем разместить автономное приложение Blazor WebAssembly с помощью Статические веб-приложения Azure, которое поддерживает этот сценарий.

Автономная работа с Docker

Автономное Blazor WebAssembly приложение публикуется в виде набора статических файлов для размещения статическим файловым сервером.

Чтобы разместить приложение в Docker, выполните следующие действия.

  • Выберите контейнер Docker с поддержкой веб-сервера, например Nginx или Apache.
  • Скопируйте активы папки publish в папку, определенную на веб-сервере для размещения статических файлов.
  • При необходимости примените дополнительную конфигурацию для обслуживания Blazor WebAssembly приложения.

Инструкции по настройке см. в следующих ресурсах:

Значения конфигурации хоста

Blazor WebAssembly приложения могут принимать следующие значения конфигурации узла в качестве аргументов командной строки во время выполнения в Development среде.

Корень содержимого

Аргумент --contentroot задает абсолютный путь к каталогу, где находятся файлы содержимого приложения (корневой каталог содержимого). В следующих примерах /content-root-path — это путь к корневому каталогу содержимого приложения.

  • Передайте этот аргумент при локальном запуске приложения в командной строке. Перейдите в каталог приложения и выполните следующую команду:

    dotnet watch --contentroot=/content-root-path
    
  • Добавьте запись в файл приложения launchSettings.json в профиле IIS Express. Этот параметр используется при запуске приложения с отладчиком Visual Studio и из командной строки с dotnet watch (или dotnet run).

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • В Visual Studio укажите аргумент в Properties>Debug>Application arguments. При задании аргумента на странице свойств Visual Studio аргумент добавляется в файл launchSettings.json.

    --contentroot=/content-root-path
    

Базовый путь

Аргумент --pathbase задает базовый путь приложения для локального выполнения с некорневым относительным путем URL (в теге <base> переменная href задана с путем, отличным от / для промежуточной и рабочей среды). В следующих примерах /relative-URL-path — это базовый путь приложения. Дополнительные сведения см. в разделе ASP.NET Core Blazor базовый путь приложения.

Important

В отличие от пути, заданного через href в теге <base>, не ставьте завершающую косую черту (/) когда передаёте значение аргумента --pathbase. Если основной путь приложения задан в теге <base> как <base href="/CoolApp/"> (включая косую черту в конце), передайте значение аргумента командной строки как --pathbase=/CoolApp (без косой черты в конце).

  • Передайте этот аргумент при локальном запуске приложения в командной строке. Перейдите в каталог приложения и выполните следующую команду:

    dotnet watch --pathbase=/relative-URL-path
    
  • Добавьте запись в файл приложения launchSettings.json в профиле IIS Express. Этот параметр используется при запуске приложения с отладчиком Visual Studio и из командной строки с dotnet watch (или dotnet run).

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • В Visual Studio укажите аргумент в Properties>Debug>Application arguments. Задание аргумента на странице свойств Visual Studio добавляет аргумент в файл launchSettings.json.

    --pathbase=/relative-URL-path
    

Дополнительные сведения см. в разделе ASP.NET Core Blazor базовый путь приложения.

URLs

Аргумент --urls задает IP-адреса или адреса узлов с портами и протоколами для прослушивания запросов.

  • Передайте этот аргумент при локальном запуске приложения в командной строке. Перейдите в каталог приложения и выполните следующую команду:

    dotnet watch --urls=http://127.0.0.1:0
    
  • Добавьте запись в файл приложения launchSettings.json в профиле IIS Express. Этот параметр используется при запуске приложения с отладчиком Visual Studio и из командной строки с dotnet watch (или dotnet run).

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • В Visual Studio укажите аргумент в Properties>Debug>Application arguments. Задание аргумента на странице свойств Visual Studio добавляет аргумент в файл launchSettings.json.

    --urls=http://127.0.0.1:0
    

Настройка средства обрезки

Blazor выполняет обрезку промежуточного языка (IL) в каждой сборке Release, чтобы удалить ненужный код IL из выходных сборок. Дополнительные сведения см. в разделе Настройка триммера для ASP.NET Core Blazor.

Настройте компоновщик

Blazor выполняет связывание промежуточного языка (IL) в каждой сборке Release, чтобы удалить ненужные части кода IL из выходных сборок. Подробнее см. в разделе Настройка компоновщика для ASP.NET Core Blazor.

Изменение расширения имени файла DLL-файлов

Этот раздел относится к .NET 5–.NET 7. В .NET 8 или позже сборки .NET развертываются в виде файлов WebAssembly (.wasm) с помощью формата файла Webcil.

Если брандмауэр, антивирусная программа или сетевое устройство безопасности блокирует передачу файлов библиотеки динамической компоновки (DLL) приложения (.dll), вы можете следовать инструкциям в этом разделе, чтобы изменить расширения имен файлов опубликованных DLL-файлов приложения.

Изменение расширений имен файлов DLL приложения может не устранить проблему, так как многие системы безопасности сканируют содержимое файлов приложения, а не просто проверяют расширения файлов.

Для более надежного подхода в средах, которые блокируют загрузку и выполнение DLL-файлов, выполните любой из следующих подходов:

  • Используйте .NET 8 или более поздней версии, которая упаковывает сборки .NET в файлы WebAssembly (.wasm) с помощью формата файла Webcil. Для получения дополнительной информации, см. раздел Webcil формат упаковки для сборок .NET в статьях версии .NET 8 или более поздних.
  • В .NET 6 или более поздней версии используйте пользовательский макет развертывания.

Сторонние подходы существуют для решения этой проблемы. Дополнительные сведения см. в ресурсах на Awesome Blazor.

После публикации приложения используйте скрипт оболочки или конвейер сборки DevOps для переименования .dll-файлов для использования другого расширения файла в каталоге опубликованных выходных данных приложения.

В следующих примерах:

  • Для обновления расширений файлов используется PowerShell (PS).
  • Файлы .dll переименовываются с использованием расширения имени файла .bin из командной строки.
  • Файлы, перечисленные в опубликованном Blazor манифесте загрузки с расширением .dll файла, обновляются до .bin расширения файла.
  • Если также используются ресурсы service worker, команда PowerShell обновляет файлы .dll, перечисленные в файле service-worker-assets.js, изменяя расширение их имени на .bin.

Чтобы использовать расширение файла, отличное от .bin, замените .bin в приведенных ниже командах нужным расширением файла.

В следующих командах заполнитель {PATH} обозначает путь к опубликованной папке _framework в папке publish.

Переименуйте расширения файлов в папке:

dir {PATH} | rename-item -NewName { $_.name -replace ".dll\b",".bin" }

Переименуйте расширения файлов в blazor.boot.json файле:

((Get-Content {PATH}\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\blazor.boot.json

Если рабочие ресурсы службы также используются, так как приложение является прогрессивным веб-приложением (PWA):

((Get-Content {PATH}\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\service-worker-assets.js

В предыдущей команде заполнитель {PATH} — это путь к опубликованному файлу service-worker-assets.js.

Чтобы устранить сжатый blazor.boot.json файл, выполните любой из следующих подходов:

  • Повторно сжать обновленный blazor.boot.json файл, создав новые blazor.boot.json.gz и blazor.boot.json.br файлы. (Recommended)
  • Удалите сжатые файлы blazor.boot.json.gz и blazor.boot.json.br. (Сжатие отключено с помощью этого подхода.)

Для сжатого файла service-worker-assets.js используйте любой из следующих подходов:

  • Повторно сжать обновленный service-worker-assets.js файл, создав новые service-worker-assets.js.br и service-worker-assets.js.gz файлы. (Recommended)
  • Удалите сжатые файлы service-worker-assets.js.gz и service-worker-assets.js.br. (Сжатие отключено с помощью этого подхода.)

Чтобы автоматизировать изменение расширения на Windows в .NET 6/7, следующий подход использует скрипт PowerShell, размещенный в корне проекта. Следующий скрипт, который отключает сжатие, является основой для дальнейшего изменения, если вы хотите повторно сжать blazor.boot.json файл и service-worker-assets.js файл, если приложение является прогрессивным веб-приложением (PWA). Путь к publish папке передается скрипту при выполнении.

ChangeDLLExtensions.ps1::

param([string]$filepath)
dir $filepath\wwwroot\_framework | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.gz
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.br

Если рабочие ресурсы службы также используются, так как приложение является прогрессивным веб-приложением (PWA), добавьте следующие команды:

((Get-Content $filepath\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\service-worker-assets.js
Remove-Item $filepath\wwwroot\service-worker-assets.js.gz
Remove-Item $filepath\wwwroot\service-worker-assets.js.br

В файле проекта скрипт выполняется после публикации приложения для конфигурации Release:

<Target Name="ChangeDLLFileExtensions" AfterTargets="AfterPublish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; {.\ChangeDLLExtensions.ps1 '$(SolutionDir)'}&quot;" />
</Target>

После публикации приложения вручную повторно выполните сжатие blazor.boot.json, и при использовании - service-worker-assets.js, чтобы снова включить сжатие.

Note

При переименовании и ленивой загрузке одинаковых сборок см. руководство по сборкам Lazy load в ASP.NET Core Blazor WebAssembly.

Как правило, серверу приложения требуется настройка статического ресурса для обслуживания файлов с обновленным расширением. Для приложения, размещенного в IIS, добавьте запись карты MIME (<mimeMap>) для нового расширения файла в разделе статического содержимого (<staticContent>) в пользовательском файле web.config. В следующем примере предполагается, что расширение файла изменено на .dll.bin:

<staticContent>
  ...
  <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
  ...
</staticContent>

Включите обновление для сжатых файлов, если сжатие используется:

<mimeMap fileExtension=".bin.br" mimeType="application/octet-stream" />
<mimeMap fileExtension=".bin.gz" mimeType="application/octet-stream" />

Удалите запись для файлового расширения .dll.

- <mimeMap fileExtension=".dll" mimeType="application/octet-stream" />

Удалите записи для сжатых .dll файлов, если сжатие используется:

- <mimeMap fileExtension=".dll.br" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dll.gz" mimeType="application/octet-stream" />

Дополнительные сведения о пользовательских web.config файлах смотрите в разделе «Использование пользовательского web.config».

Нарушение данных перед развертыванием

Обычно при развертывании:

  • Заменяются только измененные файлы, что обычно приводит к ускорению развертывания.
  • Существующие файлы, не являющиеся частью нового развертывания, остаются на месте для использования в новом развертывании.

В редких случаях устаревшие файлы из предыдущих развертываний могут повредить новое развертывание. Полное удаление существующего развертывания (или локально размещённого приложения перед развертыванием) может помочь устранить проблему с повреждённым развертыванием. Часто для устранения проблемы достаточно удалить существующее развертывание однократно, в том числе для конвейера сборки и развертывания DevOps.

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