Обучение
Модуль
Публикация приложения Blazor WebAssembly и .NET API с помощью статических веб-приложений Azure
Этот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание
Это не последняя версия этой статьи. В текущем релизе см. версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем релизе см. версию .NET 9 этой статьи.
Важно!
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем релизе см. версию .NET 9 этой статьи.
В этой статье описывается Blazor конфигурация приложения для обслуживания статических файлов.
Общая информация об обслуживании статических файлов с помощью соглашений о маршрутизации конечных точек для статических активов см. в разделе Сопоставление статических файлов в ASP.NET Core перед чтением этой статьи.
Статические Blazor Web Appресурсы платформы автоматически загружаются с помощью Link
заголовков, что позволяет браузеру предварительно загружать ресурсы до получения и отображения начальной страницы.
В отдельно работающих Blazor WebAssembly приложениях ресурсы платформы предназначены для высокоприоритетного скачивания и кэширования на ранних этапах index.html
обработки страниц браузера.
Свойство OverrideHtmlAssetPlaceholders
MSBuild в файле проекта приложения (.csproj
) имеет значение true
:
<PropertyGroup>
<OverrideHtmlAssetPlaceholders>true</OverrideHtmlAssetPlaceholders>
</PropertyGroup>
Следующий элемент <link>
, который содержит rel="preload"
, присутствует в содержимом <head>
wwwroot/index.html
:
<link rel="preload" id="webassembly" />
Обслуживание статических ресурсов осуществляется с помощью соглашений о маршрутизации конечных точек или ПО промежуточного слоя, описанного в следующей таблице.
Функция | интерфейс программирования приложений (API) | Версия .NET | Описание |
---|---|---|---|
Соглашения о маршрутизации статических ресурсов на конечной точке | MapStaticAssets | .NET 9 или более поздней версии | Оптимизирует доставку статических ресурсов клиентам. |
Промежуточное программное обеспечение для статических файлов | UseStaticFiles | Все версии .NET | Обслуживает статические ресурсы для клиентов без оптимизаций, которые предоставляет функция "Map Static Assets", но полезен для некоторых задач, которые функция "Map Static Assets" не может выполнить. |
Статические активы (Map Static Assets) могут заменить UseStaticFiles в большинстве ситуаций. Однако "Статические ресурсы карты" оптимизированы для размещения ресурсов из зафиксированных местоположений в приложении во время его сборки и публикации. Если приложение предоставляет ресурсы из других расположений, таких как диск или внедренные ресурсы, следует использовать UseStaticFiles.
Сопоставление статических ресурсов (MapStaticAssets) также заменяет вызовы UseBlazorFrameworkFiles в приложениях, которые обслуживают файлы платформы Blazor WebAssembly, и не требуется явно вызывать UseBlazorFrameworkFiles в Blazor Web App, так как API автоматически вызывается при вызове AddInteractiveWebAssemblyComponents.
Если включены режимы интерактивного WebAssembly или интерактивной автоматической отрисовки:
_framework/resource-collection.js
поэтому JS имеет доступ к коллекции ресурсов для расширенной навигации или реализации функций других платформ и сторонних компонентов.Промежуточный слой для статических файлов (UseStaticFiles) полезен в следующих ситуациях, которые карты статических ресурсов (MapStaticAssets) не могут обрабатывать.
Подробные сведения см. в статье Статические файлы в ASP.NET Core.
Этот раздел относится к приложениям на стороне Blazor сервера.
Ресурсы передаются через свойство ComponentBase.Assets, которое разрешает URL-адрес с отпечатком для заданного ресурса. В следующем примере Bootstrap, Blazor стилевой файл шаблона проекта (app.css
) и стилевой файл изоляции CSS (на основе пространства имен приложения BlazorSample
) связаны как в корневом компоненте, как правило, App
компонент (Components/App.razor
):
<link rel="stylesheet" href="@Assets["bootstrap/bootstrap.min.css"]" />
<link rel="stylesheet" href="@Assets["app.css"]" />
<link rel="stylesheet" href="@Assets["BlazorSample.styles.css"]" />
Этот раздел применяется к Blazor Web Appам, которые вызывают MapRazorComponents.
Компонент ImportMap
(ImportMap) представляет элемент карты импорта (<script type="importmap"></script>
), определяющий карту импорта для скриптов модулей. Компонент "Карта импорта" помещается в <head>
содержимое корневого компонента, как правило, в компонент App
(Components/App.razor
).
<ImportMap />
Если пользовательский ImportMapDefinition не назначен компоненту Import Map, карта импорта создается на основе ресурсов приложения.
Примечание
ImportMapDefinition Экземпляры являются дорогостоящими для создания, поэтому мы рекомендуем кэширование их при создании дополнительного экземпляра.
В следующих примерах показаны пользовательские определения карты импорта и создаваемые ими карты импорта.
Базовая карта импорта:
new ImportMapDefinition(
new Dictionary<string, string>
{
{ "jquery", "https://cdn.example.com/jquery.js" },
},
null,
null);
Предыдущий код приводит к следующей импортной карте:
{
"imports": {
"jquery": "https://cdn.example.com/jquery.js"
}
}
Карта импорта с ограниченной областью:
new ImportMapDefinition(
null,
new Dictionary<string, IReadOnlyDictionary<string, string>>
{
["/scoped/"] = new Dictionary<string, string>
{
{ "jquery", "https://cdn.example.com/jquery.js" },
}
},
null);
Предыдущий код приводит к следующей импортной карте:
{
"scopes": {
"/scoped/": {
"jquery": "https://cdn.example.com/jquery.js"
}
}
}
Импорт карты с проверкой целостности:
new ImportMapDefinition(
new Dictionary<string, string>
{
{ "jquery", "https://cdn.example.com/jquery.js" },
},
null,
new Dictionary<string, string>
{
{ "https://cdn.example.com/jquery.js", "sha384-abc123" },
});
Предыдущий код приводит к следующей импортной карте:
{
"imports": {
"jquery": "https://cdn.example.com/jquery.js"
},
"integrity": {
"https://cdn.example.com/jquery.js": "sha384-abc123"
}
}
Объедините определения карты импорта (ImportMapDefinition) с ImportMapDefinition.Combine.
Импортная карта, созданная из ResourceAssetCollection, которая сопоставляет статические ресурсы с их соответствующими уникальными URL-адресами:
ImportMapDefinition.FromResourceCollection(
new ResourceAssetCollection(
[
new ResourceAsset(
"jquery.fingerprint.js",
[
new ResourceAssetProperty("integrity", "sha384-abc123"),
new ResourceAssetProperty("label", "jquery.js"),
])
]));
Предыдущий код приводит к следующей импортной карте:
{
"imports": {
"./jquery.js": "./jquery.fingerprint.js"
},
"integrity": {
"jquery.fingerprint.js": "sha384-abc123"
}
}
Этот раздел применяется к Blazor Web Appам, которые вызывают MapRazorComponents.
Компонент ImportMap
отображается как встроенный тег <script>
, который нарушает строгую политику безопасности содержимого (CSP), которая задает директиву default-src
или script-src
.
Примеры того, как устранить нарушение политики с помощью целостности субресурсов (SRI) или криптографического нонса, см. в разделе об устранении нарушений CSP с помощью целостности субресурсов (SRI) или нонса.
Настройте промежуточное ПО для статических файлов, чтобы предоставлять статические ресурсы клиентам, вызвав UseStaticFiles в потоке обработки запросов приложения. Подробные сведения см. в статье Статические файлы в ASP.NET Core.
В выпусках до .NET 8 статические файлы платформы, такие как скрипт Blazor, обслуживаются через ПО промежуточного слоя для статических файлов. В .NET 8 или более поздней версии Blazor статические файлы платформы сопоставляются при помощи маршрутизации конечных точек, а промежуточное программное обеспечение для работы со статическими файлами больше не используется.
В автономных приложениях Blazor WebAssembly во время сборки или публикации платформа заменяет заполнители в index.html
на значения, вычисленные во время сборки, чтобы создать отпечаток статических ресурсов для их отображения на стороне клиента.
Отпечатки пальцев помещаются в blazor.webassembly.js
имя файла скрипта, а карта импорта создается для других ресурсов .NET.
Следующая конфигурация должна присутствовать в wwwwoot/index.html
файле автономного Blazor WebAssembly приложения для внедрения отпечатков пальцев:
<head>
...
<script type="importmap"></script>
...
</head>
<body>
...
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
...
</body>
</html>
В файле проекта (.csproj
) свойство <OverrideHtmlAssetPlaceholders>
установлено на значение true
:
<PropertyGroup>
<OverrideHtmlAssetPlaceholders>true</OverrideHtmlAssetPlaceholders>
</PropertyGroup>
При разрешении импорта для взаимодействия с JavaScript карта импорта используется браузером для разрешения индексированных файлов.
Любой скрипт в index.html
с маркером отпечатка пальца обрабатывается фреймворком. Например, файл скрипта с именем scripts.js
в папке приложения wwwroot/js
подвергается хэшированию путем добавления #[.{fingerprint}]
перед расширением файла (.js
):
<script src="js/scripts#[.{fingerprint}].js"></script>
Для клиентского рендеринга (CSR) в Blazor Web Appинтерактивных автоматических или WebAssembly режимах рендеринга, фингерпринтинг статических ресурсов на стороне сервера включается с помощью использования соглашений о конечных точках маршрутизации статических ресурсов (), компонента MapStaticAssets
и свойства ImportMap
(). Дополнительные сведения см. в разделе "Сопоставление статических файлов" в ASP.NET Core.
Для идентификации дополнительных модулей JavaScript для CSR используйте <StaticWebAssetFingerprintPattern>
элемент в файле проекта приложения (.csproj
). В следующем примере отпечатки пальцев добавляются для всех предоставленных разработчиком .mjs
файлов в приложении:
<ItemGroup>
<StaticWebAssetFingerprintPattern Include="JSModule" Pattern="*.mjs"
Expression="#[.{fingerprint}]!" />
</ItemGroup>
При разрешении импорта для взаимодействия с JavaScript карта импорта используется браузером для разрешения индексированных файлов.
Blazor
В следующих таблицах перечислены форматы статических файлов <link>
href
по выпуску .NET.
Для получения информации о расположении содержания, где размещены статические ссылки на файлы <head>
, см. раздел структура проекта Blazor ASP.NET Core. Ссылки на статические ресурсы также можно предоставлять с использованием компонентов <HeadContent>
в отдельных компонентах Razor.
Для получения информации о расположении содержания, где размещены статические ссылки на файлы <head>
, см. раздел структура проекта Blazor ASP.NET Core.
Тип приложения | Значение href |
Примеры |
---|---|---|
Blazor Web App | @Assets["{PATH}"] |
<link rel="stylesheet" href="@Assets["app.css"]" /> <link href="@Assets["_content/ComponentLib/styles.css"]" rel="stylesheet" /> |
Blazor Server† | @Assets["{PATH}"] |
<link href="@Assets["css/site.css"]" rel="stylesheet" /> <link href="@Assets["_content/ComponentLib/styles.css"]" rel="stylesheet" /> |
Автономное устройство Blazor WebAssembly | {PATH} |
<link rel="stylesheet" href="css/app.css" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Тип приложения | Значение href |
Примеры |
---|---|---|
Blazor Web App | {PATH} |
<link rel="stylesheet" href="app.css" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Blazor Server† | {PATH} |
<link href="css/site.css" rel="stylesheet" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Автономное устройство Blazor WebAssembly | {PATH} |
<link rel="stylesheet" href="css/app.css" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Тип приложения | Значение href |
Примеры |
---|---|---|
Blazor Server† | {PATH} |
<link href="css/site.css" rel="stylesheet" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Размещено Blazor WebAssembly‡ | {PATH} |
<link href="css/app.css" rel="stylesheet" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Blazor WebAssembly | {PATH} |
<link href="css/app.css" rel="stylesheet" /> <link href="_content/ComponentLib/styles.css" rel="stylesheet" /> |
Blazor Server† поддерживается в .NET 8 или более поздней версии, но больше не является шаблоном проекта после .NET 7.
При внедрении .NET 8 или более поздней версии рекомендуется обновлять размещенные приложения Blazor WebAssembly на Blazor Web App.
Этот раздел относится к .Client
проекту объекта Blazor Web App.
Обязательный <StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
параметр в .Client
проекте Blazor Web App возвращает Blazor WebAssembly поведение статических ресурсов к значениям по умолчанию, чтобы проект работал как часть размещенного проекта. Пакет Blazor WebAssembly SDK (Microsoft.NET.Sdk.BlazorWebAssembly
) настраивает статические веб-ресурсы определенным способом для работы в автономном режиме с сервером, просто используюющим выходные данные из библиотеки. Это не подходит для Blazor Web App, где часть WebAssembly приложения является логической частью хоста и должна вести себя больше как библиотека. Например, проект не предоставляет пакет стилей (такой, как BlazorSample.Client.styles.css
) и вместо этого предоставляет хосту пакет проекта, чтобы хост мог включить его в собственный пакет стилей.
Изменение значения (Default
) <StaticWebAssetProjectMode>
или удаление свойства из .Client
проекта не поддерживается.
Этот раздел относится к статическим файлам на стороне сервера.
При локальном запуске приложения статические веб-ресурсы доступны только в среде Development. Чтобы включить статические файлы для сред, отличных от Development, при локальной разработке и тестировании (например, Staging), вызовите UseStaticWebAssets на WebApplicationBuilder в файле Program
.
Предупреждение
Вызовите UseStaticWebAssets для конкретного окружения, чтобы предотвратить активацию компонента в рабочей среде, так как он обслуживает файлы из отдельных расположений на диске, отличном от диска проекта, если он вызывается в рабочей среде. В примере в этом разделе проверяется наличие Staging окружения путем вызова IsStaging.
if (builder.Environment.IsStaging())
{
builder.WebHost.UseStaticWebAssets();
}
Этот раздел относится к Blazor Web Apps.
Используйте опцию конечной точки WebAssemblyComponentsEndpointOptions.PathPrefix, чтобы задать строку пути, указывающую префикс для ресурсов Blazor WebAssembly. Путь должен соответствовать проекту приложения, на который ссылается Blazor WebAssembly.
endpoints.MapRazorComponents<App>()
.AddInteractiveWebAssemblyRenderMode(options =>
options.PathPrefix = "{PATH PREFIX}");
В предыдущем примере заполнитель {PATH PREFIX}
является префиксом пути и должен начинаться с косой черты (/
).
В следующем примере префикс пути имеет значение /path-prefix
:
endpoints.MapRazorComponents<App>()
.AddInteractiveWebAssemblyRenderMode(options =>
options.PathPrefix = "/path-prefix");
Этот раздел относится к автономным Blazor WebAssembly приложениям.
Публикация приложения помещает статические ресурсы приложения, включая Blazor файлы платформы (_framework
ресурсы папок), в корневой путь (/
) в опубликованных выходных данных. Свойство <StaticWebAssetBasePath>
, указанное в файле проекта (.csproj
), задает базовый путь к некорневому пути:
<PropertyGroup>
<StaticWebAssetBasePath>{PATH}</StaticWebAssetBasePath>
</PropertyGroup>
В предыдущем примере заполнитель {PATH}
— это путь.
Без задания <StaticWebAssetBasePath>
свойства автономное приложение публикуется по адресу /BlazorStandaloneSample/bin/Release/{TFM}/publish/wwwroot/
.
В предыдущем примере заполнителем {TFM}
является Moniker целевой платформы (TFM).
Если свойство <StaticWebAssetBasePath>
в автономном приложении Blazor WebAssembly задает путь к опубликованному статичному ресурсу app1
, корневой путь к приложению в опубликованных выходных данных — /app1
.
В файле проекта автономного Blazor WebAssembly приложения (.csproj
):
<PropertyGroup>
<StaticWebAssetBasePath>app1</StaticWebAssetBasePath>
</PropertyGroup>
В опубликованных данных путь к автономному приложению Blazor WebAssembly указан как /BlazorStandaloneSample/bin/Release/{TFM}/publish/wwwroot/app1/
.
В предыдущем примере заполнителем {TFM}
является Moniker целевой платформы (TFM).
Этот раздел относится к изолированным приложениям Blazor WebAssembly и размещенным решениям Blazor WebAssembly.
Публикация приложения помещает статические ресурсы приложения, включая Blazor файлы платформы (_framework
ресурсы папок), в корневой путь (/
) в опубликованных выходных данных. Свойство <StaticWebAssetBasePath>
, указанное в файле проекта (.csproj
), задает базовый путь к некорневому пути:
<PropertyGroup>
<StaticWebAssetBasePath>{PATH}</StaticWebAssetBasePath>
</PropertyGroup>
В предыдущем примере заполнитель {PATH}
— это путь.
Без установки свойства <StaticWebAssetBasePath>
клиентское приложение хостинг решения или автономного приложения будет опубликовано по следующим путям:
/BlazorHostedSample/Server/bin/Release/{TFM}/publish/wwwroot/
/BlazorStandaloneSample/bin/Release/{TFM}/publish/wwwroot/
Если свойство <StaticWebAssetBasePath>
в проекте Client размещенного приложения Blazor WebAssembly или в изолированном приложении Blazor WebAssembly задает в качестве пути опубликованного статического ресурса значение app1
, корневой путь к приложению в опубликованных выходных данных будет иметь значение /app1
.
В файле проекта приложения Client (.csproj
) или в файле проекта изолированного приложения Blazor WebAssembly (.csproj
):
<PropertyGroup>
<StaticWebAssetBasePath>app1</StaticWebAssetBasePath>
</PropertyGroup>
В опубликованном материале:
/BlazorHostedSample/Server/bin/Release/{TFM}/publish/wwwroot/app1/
/BlazorStandaloneSample/bin/Release/{TFM}/publish/wwwroot/app1/
Свойство <StaticWebAssetBasePath>
чаще всего используется для управления путями к опубликованным статическим ресурсам нескольких приложений Blazor WebAssembly в одном размещенном развертывании. Для получения дополнительной информации см. статью Несколько размещённых приложений ASP.NET CoreBlazor WebAssembly. Свойство также применяется в изолированных приложениях Blazor WebAssembly.
В предыдущих примерах заполнитель {TFM}
— это Монникер целевой платформы (TFM).
Этот раздел относится к статическим файлам на стороне сервера.
Чтобы создать дополнительные сопоставления файлов с помощью FileExtensionContentTypeProvider или настроить другие StaticFileOptions, используйте один из следующих способов. В следующих примерах заполнитель {EXTENSION}
является расширением файла, а заполнитель {CONTENT TYPE}
— типом содержимого. Пространство имен для следующего API — Microsoft.AspNetCore.StaticFiles.
Настройка параметров через внедрение зависимостей (DI) в Program
файле, используя StaticFileOptions:
var provider = new FileExtensionContentTypeProvider();
provider.Mappings["{EXTENSION}"] = "{CONTENT TYPE}";
builder.Services.Configure<StaticFileOptions>(options =>
{
options.ContentTypeProvider = provider;
});
app.UseStaticFiles();
Передайте StaticFileOptions непосредственно в UseStaticFiles в файл Program
:
var provider = new FileExtensionContentTypeProvider();
provider.Mappings["{EXTENSION}"] = "{CONTENT TYPE}";
app.UseStaticFiles(new StaticFileOptions { ContentTypeProvider = provider });
Чтобы создать дополнительные сопоставления файлов с помощью FileExtensionContentTypeProvider или настроить другие StaticFileOptions, используйте один из следующих способов. В следующих примерах заполнитель {EXTENSION}
является расширением файла, а заполнитель {CONTENT TYPE}
— типом содержимого.
Настройка параметров через внедрение зависимостей (DI) в Program
файле, используя StaticFileOptions:
using Microsoft.AspNetCore.StaticFiles;
...
var provider = new FileExtensionContentTypeProvider();
provider.Mappings["{EXTENSION}"] = "{CONTENT TYPE}";
builder.Services.Configure<StaticFileOptions>(options =>
{
options.ContentTypeProvider = provider;
});
Этот подход настраивает того же поставщика файлов, который используется для обслуживания скрипта Blazor. Убедитесь, что настраиваемая конфигурация не вмешивается в обслуживание скрипта Blazor . Например, не следует удалять сопоставление для файлов JavaScript, настраивая поставщика с помощью provider.Mappings.Remove(".js")
.
Используйте два вызова UseStaticFiles в Program
файле:
using Microsoft.AspNetCore.StaticFiles;
...
var provider = new FileExtensionContentTypeProvider();
provider.Mappings["{EXTENSION}"] = "{CONTENT TYPE}";
app.UseStaticFiles(new StaticFileOptions { ContentTypeProvider = provider });
app.UseStaticFiles();
Чтобы избежать помех при предоставлении _framework/blazor.server.js
, вы можете использовать MapWhen для исполнения собственного промежуточного ПО для обработки статических файлов.
app.MapWhen(ctx => !ctx.Request.Path
.StartsWithSegments("/_framework/blazor.server.js"),
subApp => subApp.UseStaticFiles(new StaticFileOptions() { ... }));
Рекомендации, приведенные в этом разделе, применяются только к Blazor Web App.
Для предоставления файлов из нескольких местоположений с помощью CompositeFileProvider:
Program
проекта сервера.Program
проекта сервера перед вызовом UseStaticFiles:Пример:
Создайте новую папку в серверном проекте с именем AdditionalStaticAssets
. Поместите изображение в папку.
Добавьте следующую инструкцию using
в начало файла Program
проекта сервера.
using Microsoft.Extensions.FileProviders;
Добавьте следующий код в файл проекта Program
сервера перед вызовомUseStaticFiles:
var secondaryProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "AdditionalStaticAssets"));
app.Environment.WebRootFileProvider = new CompositeFileProvider(
app.Environment.WebRootFileProvider, secondaryProvider);
В разметке компонента Home
, принадлежащего приложению Home.razor
, сослаться на изображение, используя тег <img>
:
<img src="{IMAGE FILE NAME}" alt="{ALT TEXT}" />
В предыдущем примере:
{IMAGE FILE NAME}
— это имя файла изображения. Нет необходимости предоставлять сегмент пути, если файл изображения находится в корне AdditionalStaticAssets
папки.{ALT TEXT}
— это альтернативный текст изображения.Запустите приложение.
Отзыв о ASP.NET Core
ASP.NET Core — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Обучение
Модуль
Публикация приложения Blazor WebAssembly и .NET API с помощью статических веб-приложений Azure