Новые возможности ASP.NET Core 9.0
В этой статье рассматриваются наиболее значительные изменения в ASP.NET Core 9.0 со ссылками на соответствующую документацию.
Эта статья была обновлена для .NET 9 ( предварительная версия 5).
Blazor
В этом разделе описываются новые возможности.Blazor
.NET MAUIBlazor Hybrid Шаблон решения веб-приложения и
Новый шаблон решения упрощает создание .NET MAUI собственных и Blazor веб-клиентских приложений, использующих один и тот же пользовательский интерфейс. В этом шаблоне показано, как создавать клиентские приложения, которые позволяют максимально использовать код и использовать целевой объект Android, iOS, Mac, Windows и Web.
К ключевым функциям этого шаблона относятся:
- Возможность выбора интерактивного Blazor режима отрисовки для веб-приложения.
- Автоматическое создание соответствующих проектов, включая Blazor веб-приложение (глобальную интерактивную отрисовку) и .NET MAUIBlazor Hybrid приложение.
- Созданные проекты используют общую Razor библиотеку классов (RCL) для обслуживания компонентов пользовательского Razor интерфейса.
- Пример кода включается, демонстрирующий использование внедрения зависимостей для предоставления различных реализаций интерфейса для Blazor Hybrid приложения и Blazor веб-приложения.
Чтобы приступить к работе, установите пакет SDK для .NET 9 и установите рабочую .NET MAUI нагрузку, содержащую шаблон:
dotnet workload install maui
Создайте решение из шаблона проекта в командной оболочке с помощью следующей команды:
dotnet new maui-blazor-web
Шаблон также доступен в Visual Studio.
Примечание.
В настоящее время исключение возникает, если Blazor режимы отрисовки определяются на уровне страницы или компонента. Дополнительные сведения см. в разделе BlazorWebView, который требуется для включения переопределения ResolveComponentForRenderMode (dotnet/aspnetcore
#51235).
Дополнительные сведения см. в статье "Создание .NET MAUIBlazor Hybrid приложения с Blazor помощью веб-приложения".
Оптимизация доставки статических ресурсов
MapStaticAssets
— это новое ПО промежуточного слоя, которое помогает оптимизировать доставку статических ресурсов в любом приложении ASP.NET Core, включая Blazor приложения.
Дополнительные сведения см. в любом из следующих ресурсов:
- Раздел "Оптимизация доставки статических веб-ресурсов" этой статьи.
- ASP.NET статические файлы CoreBlazor.
Обнаружение расположения отрисовки, интерактивности и назначенного режима отрисовки во время выполнения
Мы представили новый API, предназначенный для упрощения процесса запроса состояний компонентов во время выполнения. Этот API предоставляет следующие возможности:
- Определите текущее расположение выполнения компонента: это может быть особенно полезно для отладки и оптимизации производительности компонентов.
- Проверьте, работает ли компонент в интерактивной среде: это может быть полезно для компонентов, которые имеют разные поведения в зависимости от интерактивности среды.
- Получите назначенный режим отрисовки для компонента: понимание режима отрисовки может помочь в оптимизации процесса отрисовки и повышении общей производительности компонента.
Улучшена возможность повторного подключения на стороне сервера:
Следующие улучшения были улучшены в интерфейсе повторного подключения на стороне сервера по умолчанию:
Когда пользователь переходит обратно к приложению с отключенным каналом, повторное подключение выполняется немедленно, а не ожидает продолжительности следующего интервала повторного подключения. Это улучшает взаимодействие с пользователем при переходе к приложению на вкладке браузера, которая ушла в спящий режим.
Когда попытка повторного подключения достигает сервера, но сервер уже выпустил канал, происходит автоматическое обновление страницы. Это позволяет пользователю вручную обновить страницу, если она, скорее всего, приведет к успешному повторному подключению.
Время повторного подключения использует вычисленную стратегию обратного выхода. По умолчанию первые несколько попыток повторного подключения происходят в быстром последовательности без интервала повтора, прежде чем вычисляемые задержки вводятся между попытками. Поведение интервала повтора можно настроить, указав функцию для вычисления интервала повтора, как показано в следующем экспоненциальном примере обратного выхода:
Blazor.start({ circuit: { reconnectionOptions: { retryIntervalMilliseconds: (previousAttempts, maxRetries) => previousAttempts >= maxRetries ? null : previousAttempts * 1000 }, }, });
Стилизация пользовательского интерфейса повторного подключения по умолчанию была обновлена.
Дополнительные сведения см. в статье Руководство по ASP.NET Core BlazorSignalR.
Упрощенная сериализация состояния проверки подлинности для Blazor веб-приложения
Новые API упрощают добавление проверки подлинности в существующее Blazor веб-приложение. При создании нового Blazor веб-приложения с проверкой подлинности с помощью отдельных учетных записей и включена интерактивность на основе WebAssembly, проект включает в себя как в AuthenticationStateProvider серверных, так и клиентских проектах.
Эти поставщики перетекают состояние проверки подлинности пользователя в браузер. Проверка подлинности на сервере, а не клиент позволяет приложению получать доступ к состоянию проверки подлинности во время предварительной Blazor WebAssembly подготовки и до инициализации среды выполнения.
Пользовательские AuthenticationStateProvider реализации используют службу состояния сохраняемого компонента (PersistentComponentState) для сериализации состояния проверки подлинности в примечаниях HTML и считывания его обратно из WebAssembly для создания нового AuthenticationState экземпляра.
Это хорошо работает, если вы начали работу с Blazor шаблона проекта веб-приложения и выбрали параметр "Отдельные учетные записи ", но это много кода для реализации самостоятельно или копирования, если вы пытаетесь добавить проверку подлинности в существующий проект. Теперь существуют API, которые теперь являются частью Blazor шаблона проекта веб-приложения, которые могут вызываться в проектах сервера и клиента для добавления этой функции:
AddAuthenticationStateSerialization
: добавляет необходимые службы для сериализации состояния проверки подлинности на сервере.AddAuthenticationStateDeserialization
: добавляет необходимые службы для десериализации состояния проверки подлинности в браузере.
По умолчанию API сериализует только серверное имя и утверждения роли для доступа в браузере. Параметр можно передать для AddAuthenticationStateSerialization
включения всех утверждений.
Дополнительные сведения см. в следующих разделах статьи **:
- BlazorIdentity Пользовательский интерфейс (отдельные учетные записи)
- Управление состоянием проверки подлинности в Blazor веб-приложения
Добавление страниц отрисовки на стороне сервера (SSR) в глобально интерактивное Blazor веб-приложение
В выпуске .NET 9 теперь проще добавить статические страницы SSR в приложения, которые принимают глобальную интерактивность.
Этот подход полезен только в том случае, если приложение имеет определенные страницы, которые не могут работать с интерактивным сервером или отрисовкой WebAssembly. Например, используйте этот подход для страниц, которые зависят от чтения и записи HTTP-файлов cookieи могут работать только в цикле запроса или ответа вместо интерактивной отрисовки. Для страниц, работающих с интерактивной отрисовкой, их не следует заставлять использовать статическую отрисовку SSR, так как это менее эффективно и менее гибко для конечного пользователя.
Пометьте любую Razor страницу компонента с новым [ExcludeFromInteractiveRouting]
атрибутом, назначенным директивой @attribute
Razor :
@attribute [ExcludeFromInteractiveRouting]
Применение атрибута приводит к переходу на страницу для выхода из интерактивной маршрутизации. Входящий переход принудительно выполняет перезагрузку полностраничной перезагрузки вместо разрешения страницы с помощью интерактивной маршрутизации. Перезагрузка полностраничной перезагрузки заставляет корневой компонент верхнего уровня( как правило App
, компонент (App.razor
) перенаправить с сервера, что позволяет приложению переключиться на другой режим отрисовки верхнего уровня.
Метод HttpContext.AcceptsInteractiveRouting
расширения позволяет компоненту определить, применяется ли [ExcludeFromInteractiveRouting]
к текущей странице.
В компоненте App
используйте шаблон в следующем примере:
- Страницы, которые не помечены по
[ExcludeFromInteractiveRouting]
умолчанию в режиме отрисовки с глобальнойInteractiveServer
интерактивностью. Вы можете заменитьInteractiveServer
InteractiveWebAssembly
InteractiveAuto
или указать другой глобальный режим отрисовки по умолчанию. - Страницы, аннотированные с
[ExcludeFromInteractiveRouting]
использованием статического SSR (PageRenderMode
назначаетсяnull
).
<!DOCTYPE html>
<html>
<head>
...
<HeadOutlet @rendermode="@PageRenderMode" />
</head>
<body>
<Routes @rendermode="@PageRenderMode" />
...
</body>
</html>
@code {
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private IComponentRenderMode? PageRenderMode
=> HttpContext.AcceptsInteractiveRouting() ? InteractiveServer : null;
}
Альтернативой использованию метода расширения является чтение метаданных конечной HttpContext.AcceptsInteractiveRouting
точки вручную.HttpContext.GetEndpoint()?.Metadata
Эта функция рассматривается в справочной документации в режимах отрисовки ASP.NET CoreBlazor.
Внедрение конструктора
Razor компоненты поддерживают внедрение конструктора.
В следующем примере частичный класс (code-behind) внедряет NavigationManager
службу с помощью основного конструктора:
public partial class ConstructorInjection(NavigationManager navigation)
{
protected NavigationManager Navigation { get; } = navigation;
}
Дополнительные сведения см. в статье Внедрение зависимостей Blazor ASP.NET Core.
Сжатие Websocket для компонентов интерактивного сервера
По умолчанию компоненты интерактивного сервера обеспечивают сжатие для подключений WebSocket и задают frame-ancestors
директиву 'self'
"Политика безопасности содержимого" (CSP), которая позволяет внедрять приложение только в <iframe>
источник, из которого приложение обслуживается при включении сжатия или при указании конфигурации контекста WebSocket.
Сжатие может быть отключено с помощью параметра ConfigureWebSocketOptions
null
, что снижает уязвимость приложения к атаке , но может привести к снижению производительности:
.AddInteractiveServerRenderMode(o => o.ConfigureWebSocketOptions = null)
Настройте более frame-ancestors
строгий поставщик служб CSP со значением 'none'
(требуется одинарные кавычки), что позволяет сжатию WebSocket, но не позволяет браузерам внедрять приложение в любое:<iframe>
.AddInteractiveServerRenderMode(o => o.ContentSecurityFrameAncestorsPolicy = "'none'")
Дополнительные сведения см. на следующих ресурсах:
- Руководство по ASP.NET Core BlazorSignalR
- Руководство по устранению угроз для интерактивной отрисовки на стороне сервера ASP.NET Core Blazor
Обработка событий композиции клавиатуры в Blazor
Новое KeyboardEventArgs.IsComposing
свойство указывает, является ли событие клавиатуры частью сеанса композиции. Отслеживание состояния композиции событий клавиатуры имеет решающее значение для обработки международных методов ввода символов.
Добавлен параметр OverscanCount
для команды QuickGrid
.
Компонент QuickGrid
теперь предоставляет OverscanCount
свойство, указывающее, сколько дополнительных строк отрисовывается до и после видимого региона при включенной виртуализации.
Значение по умолчанию OverscanCount
— 3. В следующем примере увеличивается OverscanCount
до 4:
<QuickGrid ItemsProvider="itemsProvider" Virtualize="true" OverscanCount="4">
...
</QuickGrid>
SignalR
В этом разделе описываются новые возможности.SignalR
Поддержка полиморфного типа в SignalR Центрах
Теперь методы концентратора могут принимать базовый класс вместо производного класса для включения полиморфных сценариев. Базовый тип должен быть аннотирован, чтобы разрешить полиморфизм.
public class MyHub : Hub
{
public void Method(JsonPerson person)
{
if (person is JsonPersonExtended)
{
}
else if (person is JsonPersonExtended2)
{
}
else
{
}
}
}
[JsonPolymorphic]
[JsonDerivedType(typeof(JsonPersonExtended), nameof(JsonPersonExtended))]
[JsonDerivedType(typeof(JsonPersonExtended2), nameof(JsonPersonExtended2))]
private class JsonPerson
{
public string Name { get; set; }
public Person Child { get; set; }
public Person Parent { get; set; }
}
private class JsonPersonExtended : JsonPerson
{
public int Age { get; set; }
}
private class JsonPersonExtended2 : JsonPerson
{
public string Location { get; set; }
}
Минимальные API
В этом разделе описываются новые функции для минимальных API.
В TypedResults
добавлены аргументы InternalServerError
и InternalServerError<TValue>
.
Класс TypedResults является полезным средством для возврата строго типизированных ответов на основе кода состояния HTTP из минимального API. TypedResults
Теперь включает методы и типы фабрики для возврата ответов "500 внутренних ошибок сервера" из конечных точек. Ниже приведен пример, который возвращает ответ 500:
var app = WebApplication.Create();
app.MapGet("/", () => TypedResults.InternalServerError("Something went wrong!"));
app.Run();
OpenAPI
Встроенная поддержка создания документов OpenAPI
Спецификация OpenAPI — это стандарт для описания API-интерфейсов HTTP. Стандарт позволяет разработчикам определять форму API, которые можно подключить к клиентским генераторам, генераторам серверов, средствам тестирования, документации и т. д. В .NET 9 Preview ASP.NET Core обеспечивает встроенную поддержку создания документов OpenAPI, представляющих контроллер или минимальные API через пакет Microsoft.AspNetCore.OpenApi .
Следующие выделенные вызовы кода:
AddOpenApi
для регистрации необходимых зависимостей в контейнере DI приложения.MapOpenApi
для регистрации необходимых конечных точек OpenAPI в маршрутах приложения.
var builder = WebApplication.CreateBuilder();
builder.Services.AddOpenApi();
var app = builder.Build();
app.MapOpenApi();
app.MapGet("/hello/{name}", (string name) => $"Hello {name}"!);
app.Run();
Microsoft.AspNetCore.OpenApi
Установите пакет в проекте с помощью следующей команды:
dotnet add package Microsoft.AspNetCore.OpenApi --prerelease
Запустите приложение и перейдите к openapi/v1.json
просмотру созданного документа OpenAPI:
Документы OpenAPI также можно создать во время сборки, добавив Microsoft.Extensions.ApiDescription.Server
пакет:
dotnet add package Microsoft.Extensions.ApiDescription.Server --prerelease
В файле проекта приложения добавьте следующее:
<PropertyGroup>
<OpenApiDocumentsDirectory>$(MSBuildProjectDirectory)</OpenApiDocumentsDirectory>
<OpenApiGenerateDocuments>true</OpenApiGenerateDocuments>
</PropertyGroup>
Запустите dotnet build
и проверьте созданный JSON-файл в каталоге проекта.
ASP.NET встроенное создание документов OpenAPI Core обеспечивает поддержку различных настроек и параметров. Он предоставляет преобразователи документов и операций и имеет возможность управлять несколькими документами OpenAPI для одного приложения.
Дополнительные сведения о новых возможностях документов OpenAPI в ASP.NET Core см . в новых документах Microsoft.AspNetCore.OpenApi.
Проверка подлинности и авторизация
В этом разделе описываются новые функции проверки подлинности и авторизации.
Настройка OIDC и параметра OAuth
Теперь обработчики проверки подлинности OAuth и OIDC позволяют AdditionalAuthorizationParameters
упростить настройку параметров сообщения авторизации, которые обычно включаются в строку запроса перенаправления. В .NET 8 и более ранних версиях требуется настраиваемый OnRedirectToIdentityProvider метод обратного вызова или переопределения BuildChallengeUrl в пользовательском обработчике. Ниже приведен пример кода .NET 8:
builder.Services.AddAuthentication().AddOpenIdConnect(options =>
{
options.Events.OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.SetParameter("prompt", "login");
context.ProtocolMessage.SetParameter("audience", "https://api.example.com");
return Task.CompletedTask;
};
});
Приведенный выше пример теперь можно упростить в следующем коде:
builder.Services.AddAuthentication().AddOpenIdConnect(options =>
{
options.AdditionalAuthorizationParameters.Add("prompt", "login");
options.AdditionalAuthorizationParameters.Add("audience", "https://api.example.com");
});
Настройка флагов расширенной проверки подлинности HTTP.sys
Теперь можно настроить HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING
флаги и HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL
HTTP.sys с помощью новых EnableKerberosCredentialCaching
и CaptureCredentials
свойств в HTTP.sys AuthenticationManager для оптимизации обработки проверка подлинности Windows. Например:
webBuilder.UseHttpSys(options =>
{
options.Authentication.Schemes = AuthenticationSchemes.Negotiate;
options.Authentication.EnableKerberosCredentialCaching = true;
options.Authentication.CaptureCredentials = true;
});
Разное
В следующих разделах описаны другие возможности.
Новая HybridCache
библиотека
HybridCache
API мостит некоторые пробелы в существующих IDistributedCache и IMemoryCache API. Он также добавляет новые возможности, такие как:
- Защита "Метка" для предотвращения параллельных выборок одной и той же работы.
- Настраиваемая сериализация.
HybridCache
предназначен для замены существующего IDistributedCache
и IMemoryCache
использования и предоставляет простой API для добавления нового кода кэширования. Он предоставляет единый API для кэширования внутри процесса и внепроцессного кэширования.
Чтобы узнать, как HybridCache
api упрощен, сравните его с кодом, который использует IDistributedCache
. Ниже приведен пример IDistributedCache
использования:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
Это много работы, чтобы получить право каждый раз, включая вещи, такие как сериализация. И в сценарии отсутствия кэша вы можете в конечном итоге получить несколько параллельных потоков, все получение пропущенных кэша, все получение базовых данных, все сериализация и все отправки этих данных в кэш.
Чтобы упростить и улучшить этот код, HybridCache
сначала необходимо добавить новую библиотеку Microsoft.Extensions.Caching.Hybrid
:
<PackageReference Include="Microsoft.Extensions.Caching.Hybrid" Version="9.0.0" />
HybridCache
Зарегистрируйте службу, например, зарегистрируйте реализациюIDistributedCache
:
services.AddHybridCache(); // Not shown: optional configuration API.
Теперь большинство проблем кэширования можно выгрузить в HybridCache
:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this combination.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
Мы предоставляем конкретную реализацию абстрактного HybridCache
класса с помощью внедрения зависимостей, но предполагается, что разработчики могут предоставлять пользовательские реализации API. Реализация HybridCache
касается всего, что связано с кэшированием, включая одновременную обработку операций. Маркер cancel
здесь представляет объединенную отмену всех одновременных вызывающих объектов, а не только отмену вызывающего объекта (т token
. е. ).
Сценарии высокой пропускной способности можно оптимизировать с помощью TState
шаблона, чтобы избежать некоторых накладных расходов из захваченных переменных и обратных вызовов для каждого экземпляра:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // unique key for this combination
(name, id), // all of the state we need for the final call, if needed
static async (state, token) =>
await SomeExpensiveOperationAsync(state.name, state.id, token),
token: token
);
}
}
HybridCache
использует настроенную IDistributedCache
реализацию, если она имеется, для вторичного внепроцессного кэширования, например с помощью Redis. Но даже без нее IDistributedCache
HybridCache
служба по-прежнему будет обеспечивать кэширование в процессе и защиту от метки.
Примечание о повторном использованию объекта
В типичном существующем коде, который использует IDistributedCache
, каждый извлечение объекта из кэша приводит к десериализации. Это означает, что каждый одновременный вызывающий объект получает отдельный экземпляр объекта, который не может взаимодействовать с другими экземплярами. Результатом является безопасность потоков, так как не существует риска параллельных изменений в одном экземпляре объекта.
Так как много использования будет адаптировано из существующего HybridCache
IDistributedCache
кода, сохраняет это поведение по умолчанию, HybridCache
чтобы избежать возникновения ошибок параллелизма. Однако данный вариант использования по сути является потокобезопасной:
- Если кэшируемые типы неизменяемы.
- Если код не изменяет их.
В таких случаях сообщите HybridCache
, что можно повторно использовать экземпляры следующим образом:
- Пометка типа как
sealed
. Ключевоеsealed
слово в C# означает, что класс не может быть унаследован. - Применение атрибута
[ImmutableObject(true)]
к нему. Атрибут[ImmutableObject(true)]
указывает, что состояние объекта невозможно изменить после его создания.
Повторно используя экземпляры, можно сократить затраты на выделение ЦП и объектов, HybridCache
связанных с десериализацией каждого вызова. Это может привести к улучшению производительности в сценариях, когда кэшированные объекты являются большими или часто доступны.
Другие HybridCache
функции
Например IDistributedCache
, HybridCache
поддерживает удаление по ключу RemoveKeyAsync
с помощью метода.
HybridCache
также предоставляет необязательные API для IDistributedCache
реализаций, чтобы избежать byte[]
выделения. Эта функция реализуется предварительными версиями и Microsoft.Extensions.Caching.SqlServer
пакетамиMicrosoft.Extensions.Caching.StackExchangeRedis
.
Сериализация настраивается как часть регистрации службы, с поддержкой типовых и обобщенных сериализаторов через WithSerializer
методы и .WithSerializerFactory
методы, связанные с вызовом AddHybridCache
. По умолчанию библиотека обрабатывает string
и byte[]
System.Text.Json
использует все остальное, но можно использовать protobuf, xml или что-либо другое.
HybridCache
поддерживает старые среды выполнения .NET до платформа .NET Framework 4.7.2 и .NET Standard 2.0.
Дополнительные сведения см. в HybridCache
библиотеке HybridCache в ASP.NET Core
Улучшения страницы исключений разработчика
Страница исключения разработчика ASP.NET Core отображается, когда приложение выдает необработанное исключение во время разработки. Страница исключений разработчика содержит подробные сведения об исключении и запросе.
Предварительная версия 3 добавила метаданные конечной точки на страницу исключения разработчика. ASP.NET Core использует метаданные конечной точки для управления поведением конечной точки, таких как маршрутизация, кэширование ответов, ограничение скорости, создание OpenAPI и многое другое. На следующем рисунке показаны новые сведения о метаданных в Routing
разделе страницы исключений разработчика:
При тестировании страницы исключений разработчика были определены небольшие улучшения качества жизни. Они поставляются в предварительной версии 4:
- Улучшена оболочка текста. Длинные cookieзначения, значения строки запроса и имена методов больше не добавляют горизонтальные полосы прокрутки браузера.
- Более крупный текст, найденный в современных конструкциях.
- Более согласованные размеры таблиц.
На следующем анимированном изображении показана новая страница исключений разработчика:
Улучшения отладки словаря
Отображение словарей и других коллекций "ключ-значение" имеет улучшенный макет. Ключ отображается в ключевом столбце отладчика вместо объединения со значением. На следующих изображениях показан старый и новый экран словаря в отладчике.
До:
После:
ASP.NET Core имеет множество коллекций key-value. Этот улучшенный интерфейс отладки применяется к следующему:
- Заголовки HTTP
- Строки запросов
- Формы
- Cookies
- Просмотреть данные
- Отправка данных
- Функции
Исправление для 503 во время перезапуска приложения в IIS
По умолчанию теперь задержка составляет 1 секунду между уведомлением IIS о перезапуске или завершении работы, а также когда ANCM сообщает управляемому серверу начать завершение работы. Задержка настраивается через ANCM_shutdownDelay
переменную среды или задав параметр обработчика shutdownDelay
. Оба значения находятся в миллисекундах. Задержка заключается в основном в уменьшении вероятности гонки, где:
- СЛУЖБЫ IIS не начали очереди, чтобы перейти к новому приложению.
- ANCM начинает отклонять новые запросы, поступающие в старое приложение.
Более медленные компьютеры или компьютеры с более тяжелым использованием ЦП могут потребоваться изменить это значение, чтобы уменьшить вероятность 503.
Пример параметра shutdownDelay
:
<aspNetCore processPath="dotnet" arguments="myapp.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
<handlerSettings>
<!-- Milliseconds to delay shutdown by.
this doesn't mean incoming requests will be delayed by this amount,
but the old app instance will start shutting down after this timeout occurs -->
<handlerSetting name="shutdownDelay" value="5000" />
</handlerSettings>
</aspNetCore>
Исправление находится в глобально установленном модуле ANCM, который поставляется из пакета размещения.
Оптимизация доставки статических веб-ресурсов
Создание выполняющихся веб-приложений включает оптимизацию доставки ресурсов в браузер. Это включает в себя множество таких аспектов, как:
- Задание заголовков ETag и Last-Modified.
- Настройка правильных заголовков кэширования.
- Использование по промежуточного слоя кэширования.
- Обслуживание сжатых версий ресурсов, когда это возможно.
- Использование CDN для обслуживания ресурсов ближе к пользователю.
- Минифицирование ресурсов.
MapStaticAssets
— это новое ПО промежуточного слоя, которое помогает оптимизировать доставку статических ресурсов в приложении. Она предназначена для работы со всеми платформами пользовательского интерфейса, включая BlazorRazor страницы и MVC. Обычно это замена UseStaticFiles
.
MapStaticAssets
работает путем объединения процессов сборки и публикации для сбора сведений обо всех статических ресурсах в приложении. Затем эти сведения используются библиотекой среды выполнения для эффективного обслуживания этих файлов в браузере.
MapStaticAssets
UseStaticFiles
в большинстве случаев он оптимизирован для обслуживания ресурсов, о которых приложение знает во время сборки и публикации. Если приложение обслуживает ресурсы из других расположений, таких как диск или внедренные ресурсы, UseStaticFiles
следует использовать.
MapStaticAssets
предоставляет следующие преимущества, с которыми UseStaticFiles
не найдено:
- Сжатие времени сборки для всех ресурсов в приложении:
gzip
во время разработки иgzip + brotli
во время публикации.- Все ресурсы сжимаются с целью уменьшения размера ресурсов до минимального.
- На основе
ETags
содержимого:Etags
для каждого ресурса используется строка в кодировке Base64 хэша SHA-256 содержимого. Это гарантирует, что браузер перезагрузит файл только в том случае, если его содержимое изменилось.
В следующей таблице показаны исходные и сжатые размеры CSS и JS файлов в шаблоне Pages по умолчанию Razor :
Файлы | Исходная | Compressed | Сокращение % |
---|---|---|---|
bootstrap.min.css | 163 | 17,5 | 89.26% |
jquery.js | 89.6 | 28 | 68.75% |
bootstrap.min.js | 78,5 | 20 | 74.52% |
Всего | 331.1 | 65,5 | 80.20% |
В следующей таблице показаны исходные и сжатые размеры с помощью библиотеки компонентов пользовательского интерфейса Blazor Fluent:
Файлы | Исходная | Compressed | Сокращение % |
---|---|---|---|
fluent.js | 384 | 73 | 80.99% |
fluent.css | 94 | 11 | 88.30% |
Всего | 478 | 84 | 82.43% |
В общей сложности 478 КБ сжато до 84 КБ.
В следующей таблице показаны исходные и сжатые размеры с помощью библиотеки компонентов ГрязиBlazorBlazor:
Файлы | Исходная | Compressed | Сокращение |
---|---|---|---|
ГрязьBlazor.min.css | 541 | 37,5 | 93.07% |
ГрязьBlazor.min.js | 47,4 | 9,2 | 80.59% |
Всего | 588.4 | 46,7 | 92.07% |
Оптимизация происходит автоматически при использовании MapStaticAssets
. При добавлении или обновлении библиотеки, например с новым JavaScript или CSS, ресурсы оптимизированы в рамках сборки. Оптимизация особенно полезна для мобильных сред, которые могут иметь более низкую пропускную способность или ненадежные подключения.
Включение динамического сжатия на сервере и использование MapStaticAssets
MapStaticAssets
имеет следующие преимущества по сравнению с динамическим сжатием на сервере:
- Проще, так как нет конкретной конфигурации сервера.
- Более эффективна, так как ресурсы сжимаются во время сборки.
- Позволяет разработчику тратить дополнительное время во время процесса сборки, чтобы обеспечить минимальный размер ресурсов.
Рассмотрим следующую таблицу сравнения сжатия грязиBlazor с динамическим сжатием IIS и MapStaticAssets
:
Служба IIS gzip | MapStaticAssets | Сокращение MapStaticAssets |
---|---|---|
≅ 90 | 37,5 | 59 % |
ASP.NET Core
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по