Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Публикация и развертывание Native приложений в режиме предварительной компиляции (AOT) в ASP.NET Core предлагает несколько преимуществ:
Минимизированный объем занимаемого дискового пространства. При публикации приложения с помощью Native AOT процесс создает один исполняемый файл. Исполняемый файл содержит только код из внешних зависимостей, необходимых для поддержки приложения. Уменьшенный размер исполняемого файла может привести к следующим:
- Небольшие образы контейнеров, например в сценариях контейнерного развертывания.
- Сокращение времени развертывания благодаря меньшим образам.
Сокращено время запуска. Для собственных приложений AOT может потребоваться меньше времени запуска, что позволяет:
- Приложение для более быстрой обработки заявок.
- Улучшено развертывание, в котором оркестраторы контейнеров управляют переходом из одной версии приложения в другую.
Сокращение спроса на память. Собственные приложения AOT могут требовать меньше памяти в зависимости от работы, выполняемой приложением. Снижение потребления памяти может привести к повышению плотности развертывания и повышению масштабируемости.
На следующей диаграмме показаны результаты теста бенчмаркинга различных шаблонных приложений. Эталонный тест сравнивает производительность для опубликованного приложения AOT (оранжевая полоса), усеченного приложения среды выполнения (зеленая полоса) и необрезанного приложения среды выполнения (желтая полоса). Тест показал, что приложение Native AOT демонстрирует более низкий размер приложения, использование памяти и время запуска.
В этой статье описывается поддержка собственных приложений AOT в ASP.NET Core, включая обзор публикации и развертывания.
Инструкции по ASP.NET Core Blazor WebAssembly Native AOT, которые дополняют или заменяют инструкции, приведенные в этой статье, см. в разделе ASP.NET Core Blazor WebAssembly средства сборки и предварительной компиляции (AOT).
Рассмотрение совместимости ASP.NET Core и Native AOT
В настоящее время не все функции в ASP.NET Core совместимы с Native AOT.
В следующей таблице представлена сводка совместимости функций ASP.NET Core с нативной AOT.
| Функция | Поддерживается | Частичная поддержка | Не поддерживаются |
|---|---|---|---|
| Blazor Server | ❌ | ||
| CORS (Совместное использование ресурсов разных источников) | ✔️ | ||
| gRPC; | ✔️ | ||
| HealthChecks | ✔️ | ||
| логирование HTTP | ✔️ | ||
| Проверка подлинности JWT | ✔️ | ||
| Локализация | ✔️ | ||
| Минимальные API | ✔️ | ||
| MVC | ❌ | ||
| Другая проверка подлинности | ❌ | ||
| Кэширование выходных данных | ✔️ | ||
| Ограничение Скорости | ✔️ | ||
| ЗапросРазархивирования | ✔️ | ||
| Кэширование ответов | ✔️ | ||
| Сжатие ответа | ✔️ | ||
| Переписать | ✔️ | ||
| Сеанс | ❌ | ||
| SignalR | ✔️ | ||
| Спа | ❌ | ||
| StaticFiles | ✔️ | ||
| ВебСокеты | ✔️ |
Дополнительные сведения об ограничениях см. в следующем разделе:
- Ограничения развертывания Native AOT
- Предупреждения AOT
- Известные несовместимости тримминга
- Устранение предупреждений о тримминге
Проверка приложения в модели развертывания Native AOT
При переходе к нативной модели развертывания AOT важно тщательно протестировать приложение. Тестируйте развернутое приложение AOT и подтверждайте, что функциональность не изменилась по сравнению с нетриммированной и JIT-собранной версией приложения.
При создании приложения просмотрите и исправьте все предупреждения AOT. Приложение, которое выдает предупреждения AOT при публикации, может работать неправильно. Если предупреждения AOT не выдаются во время публикации, вы можете ожидать, что опубликованное приложение AOT будет работать так же, как необрезанное и скомпилированное с JIT приложение.
Публикация собственного приложения AOT (PublishAot)
Включите Native AOT для вашего приложения, используя свойство PublishAot MSBuild. В следующем примере показано, как включить Native AOT в файле проекта:
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
Свойство PublishAot включает компиляцию Native AOT во время процесса публикации и обеспечивает динамический анализ использования кода во время сборки и редактирования. Проект, использующий публикацию Native AOT, выполняет JIT-компиляцию при запуске на локальной машине.
Приложение AOT имеет следующие отличия от скомпилированного JIT-приложения:
- Особенности, несовместимые с Native AOT, отключены и вызывают исключения при выполнении.
- Исходный анализатор включен для выделения кода, несовместимого с национальным AOT. Во время публикации все приложение, включая пакеты NuGet, анализируется повторно для совместимости.
Анализ с использованием Native AOT включает весь код приложения и библиотеки, от которых зависит приложение. Просмотрите предупреждения Native AOT и выполните действия по исправлению. Рекомендуется часто публиковать приложения для обнаружения проблем в начале жизненного цикла разработки.
В .NET 8 и более поздних версиях следующие типы приложений ASP.NET Core поддерживают собственный AOT:
- Минимальные API . Дополнительные сведения см. в разделе "Обзор шаблона веб-API (Native AOT) далее в этой статье.
- gRPC — дополнительные сведения см. в разделе gRPC и Native AOT.
- Службы Worker. Для получения дополнительной информации см. статью Фоновые задачи с размещенными службами в ASP.NET Core> Native AOT.
Обзор шаблона веб-API (нативный AOT)
Шаблон ASP.NET Core Web API (Native AOT) (короткое имя webapiaot) создает проект с включенным AOT. Шаблон отличается от стандартного шаблона проекта веб-API следующим образом:
- Использует только минимальные API, так как MVC еще не совместим с Native AOT.
- CreateSlimBuilder() Использует API для обеспечения включения только основных функций по умолчанию, что позволяет свести к минимуму размер развернутого приложения.
- Настроено для прослушивания только на протоколе HTTP. Трафик HTTPS обычно обрабатывается службой входящего трафика в облачных развертываниях.
- Не включает профиль запуска для работы в IIS или IIS Express.
- Создает HTTP-файл , настроенный с примерами HTTP-запросов, которые можно отправлять в конечные точки приложения.
- Включает пример
TodoAPI вместо примера прогноза погоды. - Добавляет свойство
PublishAotв файл проекта, как описано ранее. - Включает генераторы исходного кода JSON сериализатора. Генератор исходного кода используется для создания кода сериализации во время сборки, который требуется для компиляции Native AOT.
Обновления кода для сериализации JSON (Program.cs)
Код в файле Program.cs изменяется, чтобы обеспечить поддержку создания источника сериализации JSON.
В следующем фрагменте кода показаны изменения кода:
using MyFirstAotWebApi;
+using System.Text.Json.Serialization;
-var builder = WebApplication.CreateBuilder();
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
Если вы не изменяете код, System.Text.Json использует отражение для сериализации и десериализации JSON. В системе Native AOT не поддерживается отражение.
Дополнительные сведения см. в разделе:
Изменения кода для профиля запуска (launchSettings.json)
Шаблон веб-API (Native AOT) создает файлlaunchSettings.json . В отличие от стандартного файла запуска, созданный файл не включает iisSettings раздел или IIS Express профиль.
В следующем фрагменте кода показаны исключенные разделы (цветной красный):
{
"$schema": "http://json.schemastore.org/launchsettings.json",
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:11152",
- "sslPort": 0
- }
- },
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "todos",
"applicationUrl": "http://localhost:5102",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "todos",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
}
}
CreateSlimBuilder() вызывается для минимальных настроек приложения по умолчанию
Шаблон веб-API (Native AOT) использует CreateSlimBuilder() метод вместо CreateBuilder() метода.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Метод CreateSlimBuilder инициализирует WebApplicationBuilder с минимальными функциями ASP.NET Core, необходимыми для запуска приложения.
Как описано ранее, CreateSlimBuilder метод не включает поддержку HTTPS или HTTP/3. Обычно эти протоколы не требуются для приложений, работающих за прокси-сервером завершения TLS. Например, ознакомьтесь с терминацией TLS и сквозным TLS с Шлюзом приложений. Вы можете включить HTTPS, вызвав метод builder.WebHost.UseKestrelHttpsConfiguration, или включить HTTP/3, вызвав метод builder.WebHost.UseQuic.
Сравнение CreateSlimBuilder() и CreateBuilder()
Метод CreateSlimBuilder предоставляет доступ к части функций приложения, доступных с CreateBuilder методом. Как описано ранее, шаблон Web API (Native AOT) вызывает CreateSlimBuilder для инициализации WebApplicationBuilder, поэтому построитель использует минимальные ASP.NET Core функции, необходимые для запуска приложения.
Оба метода предоставляют необходимые функции для эффективной разработки:
- Настройка файлов appsettings.json и appsettings.{EnvironmentName}.json
- Конфигурация секретов пользователей
- Логирование консоли
- Конфигурация ведения журнала
Включение минимальных функций имеет преимущества как для оптимизации, так и для "Ahead-Of-Time" компиляции. Дополнительные сведения см. в статье Обрезка автономных развертываний и исполняемых файлов.
Если вы предпочитаете использовать построитель, который пропускает все функции, см. метод WebApplication.CreateEmptyBuilder .
Недоступные функции в CreateSlimBuilder
Метод CreateSlimBuilderне предоставляет следующие функции, которые доступны в CreateBuilder:
- Размещение начальных сборок
- Метод UseStartup
- Поставщики ведения журнала:
- Функции размещения веб-сайтов:
- Kestrel Конфигурации:
- Regex и альфа-ограничения, используемые в маршрутизации (GitHub /dotnet/aspnetcore/issues #46142)
Дополнительные сведения см. в статье "Сравнение WebApplication.CreateBuilder с CreateSlimBuilder"
Используйте генераторы кода и избегайте рефлексии
Во время процесса публикации для Native AOT все неиспользуемые коды обрезаются. В результате приложение не может использовать несвязанное отражение во время выполнения. Вы можете использовать генераторы источников , которые создают код, который позволяет избежать необходимости отражения. В некоторых случаях генераторы исходного кода создают оптимизированный для AOT код, даже если генератор не требуется.
Чтобы просмотреть созданный исходный код, добавьте свойство EmitCompilerGeneratedFiles в файл проекта приложения (CSPROJ):
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <!-- Other properties omitted for brevity --> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> </PropertyGroup> </Project>Чтобы просмотреть созданный код, выполните
dotnet buildкоманду. Команда компилирует исходные файлы и создает промежуточные файлы, необходимые для запуска приложения в среде разработки. Выходные данные включают каталог obj/Debug/<.NET version>/generated/, содержащий все созданные файлы проекта.Чтобы подготовить приложение к развертыванию
dotnet publish, выполните команду. Команда компилирует исходные файлы и создает все файлы, необходимые для развертывания приложения. Он передает созданные сборки собственному компилятору IL, который создает собственный исполняемый файл. Собственный исполняемый файл содержит машинный код.
Использование библиотек с Native AOT
Многие популярные библиотеки, используемые в проектах ASP.NET Core, в настоящее время имеют некоторые проблемы совместимости при их включении в проекты, предназначенные для собственного AOT, например:
- Использование отражения для проверки и обнаружения типов
- Условная загрузка библиотек во время выполнения
- Создание кода на лету для реализации функциональных возможностей
Библиотеки, использующие эти динамические функции, требуют обновления для работы с Native AOT. Различные средства доступны для применения необходимых обновлений, таких как генераторы источников Roslyn.
Авторам библиотек, желающим поддерживать нативный AOT, рекомендуется ознакомиться со следующими статьями.
Работа с минимальными API и JSON-загрузками
Минимальный API фреймворк оптимизирован для получения и возврата пейлоадов JSON с помощью System.Text.Json.
- Пространство имен накладывает требования к совместимости для JSON и Native AOT.
- Для этого требуется использовать генератор источника System.Text.Json.
Все типы, передаваемые как часть текста HTTP или возвращенные делегатами запросов в приложениях на основе минимальных API, должны быть настроены на экземпляре JsonSerializerContext. Экземпляр должен быть зарегистрирован с помощью внедрения зависимостей ASP.NET Core:
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Контекст сериализатора JSON регистрируется в контейнере DI. Дополнительные сведения см. в разделе "Объединение генераторов источников" и TypeInfoResolverChain.
Настраиваемый
JsonSerializerContextаннотирован атрибутом JsonSerializable, который позволяет генерировать исходный код сериализатора JSON для типаToDo.
Параметр делегата, не привязанного к тексту, не должен быть сериализуемым. Например, параметр строки запроса может быть расширенным типом объектов, реализующим IParsable<T>.
public class Todo
{
public int Id { get; set; }
public string? Title { get; set; }
public DateOnly? DueBy { get; set; }
public bool IsComplete { get; set; }
}
static class TodoGenerator
{
private static readonly (string[] Prefixes, string[] Suffixes)[] _parts = new[]
{
(new[] { "Walk the", "Feed the" }, new[] { "dog", "cat", "goat" }),
(new[] { "Do the", "Put away the" }, new[] { "groceries", "dishes", "laundry" }),
(new[] { "Clean the" }, new[] { "bathroom", "pool", "blinds", "car" })
};
// Remaining code omitted for brevity.
Просмотрите известные проблемы.
Чтобы сообщить о проблемах или ознакомиться с ними, связанных с поддержкой Native AOT в ASP.NET Core, обратитесь к GitHub /dotnet/core/issues #8288).
Связанный контент
.NET 8 предоставляет поддержку .NET native с предварительной компиляцией (AOT).
Зачем использовать нативный AOT с ASP.NET Core
Публикация и развертывание собственного приложения AOT обеспечивают следующие преимущества:
-
Минимальное место на диске: при публикации с помощью машинного AOT создается один исполняемый файл, содержащий только код из внешних зависимостей, необходимых для поддержки программы. Уменьшенный размер исполняемого файла может привести к следующим:
- Небольшие образы контейнеров, например в сценариях контейнерного развертывания.
- Сокращение времени развертывания благодаря меньшим образам.
-
Сокращение времени запуска: собственные приложения AOT могут отображать сокращенное время запуска, что означает
- Приложение готово к обработке запросов быстрее.
- Улучшено развертывание, в котором оркестраторы контейнеров должны управлять переходом из одной версии приложения в другую.
- Сокращение спроса на память: собственные приложения AOT могут снизить спрос на память в зависимости от того, что выполняет приложение. Снижение потребления памяти может привести к повышению плотности развертывания и повышению масштабируемости.
Приложение-шаблон было запущено в нашей лаборатории тестирования для сравнения производительности приложения, опубликованного с использованием AOT, приложения с обрезанной средой выполнения и приложения с полной средой выполнения. На следующей диаграмме показаны результаты проверки производительности:
На приведенной выше диаграмме показано, что Native AOT имеет меньшее приложение, меньший объем использования памяти и более короткое время запуска.
совместимость ASP.NET Core и Native AOT
В настоящее время не все функции в ASP.NET Core совместимы с Native AOT. В следующей таблице представлена сводка совместимости функций ASP.NET Core с нативной AOT.
| Функция | Полностью поддерживается | Частично поддерживается | Не поддерживается |
|---|---|---|---|
| gRPC; | Полностью поддерживается | ||
| Минимальные API | Частично поддерживается | ||
| MVC | Не поддерживаются | ||
| Blazor Server | Не поддерживаются | ||
| SignalR | Не поддерживаются | ||
| Проверка подлинности JWT | Полностью поддерживается | ||
| Другая проверка подлинности | Не поддерживаются | ||
| CORS (Совместное использование ресурсов разных источников) | Полностью поддерживается | ||
| HealthChecks | Полностью поддерживается | ||
| логирование HTTP | Полностью поддерживается | ||
| Локализация | Полностью поддерживается | ||
| Кэширование выходных данных | Полностью поддерживается | ||
| Ограничение Скорости | Полностью поддерживается | ||
| ЗапросРазархивирования | Полностью поддерживается | ||
| Кэширование ответов | Полностью поддерживается | ||
| Сжатие ответа | Полностью поддерживается | ||
| Переписать | Полностью поддерживается | ||
| Сеанс | Не поддерживаются | ||
| Спа | Не поддерживаются | ||
| StaticFiles | Полностью поддерживается | ||
| ВебСокеты | Полностью поддерживается |
Дополнительные сведения об ограничениях см. в следующем разделе:
- Ограничения развертывания Native AOT
- Общие сведения о предупреждениях AOT
- Известные несовместимости тримминга
- Общие сведения о предупреждениях, связанных с обрезкой
- Проблема GitHub dotnet/core #8288
Важно тщательно протестировать приложение при переходе к модели нативного развертывания AOT. Развернутое приложение AOT должно быть проверено, чтобы убедиться, что функциональные возможности не изменились с нетриммированного и скомпилированного JIT-приложения. При создании приложения просмотрите и исправьте предупреждения AOT. Приложение, которое выдает предупреждения AOT во время публикации, может работать некорректно. Если предупреждения AOT не выдаются во время публикации, то опубликованное приложение AOT должно работать так же, как и нетриммированное и JIT-компилированное приложение.
Публикация в собственной AOT
"Нативная AOT включена с использованием свойства PublishAot MSBuild." В следующем примере показано, как включить Native AOT в файле проекта:
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
Этот параметр включает компиляцию Native AOT во время публикации и активирует динамический анализ использования кода во время сборки и редактирования. Проект, использующий публикацию Native AOT, использует JIT-компиляцию при локальном запуске. Приложение AOT имеет следующие отличия от скомпилированного JIT-приложения:
- Особенности, несовместимые с Native AOT, отключены и вызывают исключения при выполнении.
- Исходный анализатор включен для выделения кода, несовместимого с национальным AOT. Во время публикации все приложение, включая пакеты NuGet, анализируется повторно для совместимости.
Анализ нативного AOT включает весь код приложения и библиотеки, от которых приложение зависит. Просмотрите предупреждения Native AOT и выполните действия по исправлению. Рекомендуется часто публиковать приложения для обнаружения проблем в начале жизненного цикла разработки.
В .NET 8 собственный AOT поддерживается следующими типами приложений ASP.NET Core:
- Минимальные API- Дополнительные сведения см. в разделе шаблона веб-API (Native AOT) далее в этой статье.
- gRPC — дополнительные сведения см. в разделе gRPC и Native AOT.
- Сервисы рабочих процессов. Дополнительную информацию см. в разделе AOT в шаблонах сервисов рабочих процессов.
Шаблон веб-API (собственный AOT)
Шаблон ASP.NET Core Web API (Native AOT) (короткое имя webapiaot) создает проект с включенной поддержкой AOT. Шаблон отличается от шаблона проекта веб-API следующим образом:
- Использует только минимальные API, так как MVC еще не совместим с Native AOT.
- CreateSlimBuilder() Использует API для обеспечения включения только основных функций по умолчанию, минимизируя развернутый размер приложения.
- Настроен только для прослушивания HTTP, так как трафик HTTPS обычно обрабатывается службой входящего трафика в облачных развертываниях.
- Не включает профиль запуска для работы в IIS или IIS Express.
- Создает
.httpфайл, настроенный с примерами HTTP-запросов, которые можно отправлять в конечные точки приложения. - Включает пример
TodoAPI вместо примера прогноза погоды. - Добавляет
PublishAotв файл проекта, как показано ранее в этой статье. - Включает генераторы исходного кода JSON сериализатора. Генератор исходного кода используется для создания кода сериализации во время сборки, который требуется для компиляции Native AOT.
Изменения для поддержки создания источника
В следующем примере показан код, добавленный в Program.cs файл для поддержки создания источника сериализации JSON:
using MyFirstAotWebApi;
+using System.Text.Json.Serialization;
-var builder = WebApplication.CreateBuilder();
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
Без этого добавленного кода System.Text.Json использует отражение для сериализации и десериализации JSON. В системе Native AOT не поддерживается отражение.
Дополнительные сведения см. в разделе:
Изменения в launchSettings.json
Файл launchSettings.json , созданный шаблоном веб-API (Native AOT), с удаленными iisSettings разделом и IIS Express профилем:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:11152",
- "sslPort": 0
- }
- },
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "todos",
"applicationUrl": "http://localhost:5102",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "todos",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
}
}
Метод CreateSlimBuilder
Шаблон использует CreateSlimBuilder() метод вместо CreateBuilder() метода.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Метод CreateSlimBuilder инициализирует WebApplicationBuilder с минимальными функциями ASP.NET Core, необходимыми для запуска приложения.
Как отмечалось ранее, CreateSlimBuilder метод не поддерживает HTTPS или HTTP/3. Обычно эти протоколы не требуются для приложений, работающих за прокси-сервером завершения TLS. Например, ознакомьтесь с терминацией TLS и сквозным TLS с Шлюзом приложений. HTTPS можно включить, вызвав builder.WebHost.UseKestrelHttpsConfiguration, а HTTP/3 можно включить путем вызова builder.WebHost.UseQuic.
CreateSlimBuilder и CreateBuilder
Метод CreateSlimBuilder не поддерживает следующие функции, поддерживаемые методом CreateBuilder :
- Размещение начальных сборок
- UseStartup
- Следующие поставщики ведения журнала:
- Функции размещения веб-сайтов:
- Kestrel конфигурация
- Регулярные и альфа-ограничения, используемые в маршрутизации
Этот CreateSlimBuilder метод включает следующие функции, необходимые для эффективной разработки.
- Конфигурация JSON-файла для
appsettings.jsonиappsettings.{EnvironmentName}.json. - Конфигурация секретов пользователей.
- Логирование консоли.
- Конфигурация ведения журнала.
Построитель, который исключает предыдущие функции, см. в разделе " CreateEmptyBuilder Метод".
Включение минимальных функций имеет преимущества как для оптимизации, так и для "Ahead-Of-Time" компиляции. Дополнительные сведения см. в статье Обрезка автономных развертываний и исполняемых файлов.
Дополнительные сведения см. в разделе "Сравнение WebApplication.CreateBuilder с" CreateSlimBuilder
Генераторы исходного кода
Поскольку неиспользуемый код обрезается во время публикации для нативного AOT, приложение не может использовать неограниченное отражение во время выполнения. Генераторы источников используются для создания кода, который позволяет избежать необходимости отражения. В некоторых случаях генераторы источников создают код, оптимизированный для AOT, даже если генератор не требуется.
Чтобы просмотреть созданный исходный код, добавьте EmitCompilerGeneratedFiles свойство в файл приложения .csproj , как показано в следующем примере:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<!-- Other properties omitted for brevity -->
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
</Project>
dotnet build Выполните команду, чтобы просмотреть созданный код. Выходные данные включают obj/Debug/net8.0/generated/ каталог, содержащий все созданные файлы для проекта.
Команда dotnet publish также компилирует исходные файлы и создает скомпилированные файлы. Кроме того, dotnet publish передает созданные сборки собственному компилятору IL. Компилятор IL создает собственный исполняемый файл. Собственный исполняемый файл содержит машинный код.
Использование библиотек с Native AOT
Многие популярные библиотеки, используемые в проектах ASP.NET Core, в настоящее время имеют некоторые проблемы совместимости при их включении в проекты, предназначенные для собственного AOT, например:
- Использование отражения для проверки и обнаружения типов
- Условная загрузка библиотек во время выполнения
- Создание кода на лету для реализации функциональных возможностей
Библиотеки, использующие эти динамические функции, требуют обновления для работы с Native AOT. Различные средства доступны для применения необходимых обновлений, таких как генераторы источников Roslyn.
Авторам библиотек, желающим поддерживать нативный AOT, рекомендуется ознакомиться со следующими статьями.
Минимальные API-интерфейсы и полезные данные JSON
Минимальный API-фреймворк оптимизирован для получения и возврата JSON-данных с помощью System.Text.Json.
System.Text.Json:
- Накладывает требования к совместимости для JSON и Native AOT.
- Требуется использование генератора
System.Text.Jsonисточника.
Все типы, передаваемые в составе текста HTTP или возвращаемые делегатами запросов в приложениях на базе Минимальных API, должны быть зарегистрированы на JsonSerializerContext с помощью механизма внедрения зависимостей ASP.NET Core.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
В предыдущем выделенном коде:
- Контекст сериализатора JSON регистрируется в контейнере DI. Для получения дополнительной информации см.
- Пользовательский
JsonSerializerContextаннотируется атрибутом[JsonSerializable], чтобы включить код, генерируемый исходным JSON-сериализатором, для типаToDo.
Параметр делегата, который не привязан к тексту и не должен быть сериализуемым. Например, параметр строки запроса, который является типом сложного объекта и реализует IParsable<T>.
public class Todo
{
public int Id { get; set; }
public string? Title { get; set; }
public DateOnly? DueBy { get; set; }
public bool IsComplete { get; set; }
}
static class TodoGenerator
{
private static readonly (string[] Prefixes, string[] Suffixes)[] _parts = new[]
{
(new[] { "Walk the", "Feed the" }, new[] { "dog", "cat", "goat" }),
(new[] { "Do the", "Put away the" }, new[] { "groceries", "dishes", "laundry" }),
(new[] { "Clean the" }, new[] { "bathroom", "pool", "blinds", "car" })
};
// Remaining code omitted for brevity.
Известные проблемы
Ознакомьтесь с этой задачей на GitHub, чтобы сообщить или просмотреть проблемы с поддержкой Native AOT в ASP.NET Core.
См. также
- Руководство. Публикация приложения ASP.NET Core с помощью Native AOT
- Нативное развертывание AOT
- Оптимизация развертываний AOT
- Генератор источника привязки конфигурации
- Использование генератора источника привязки конфигурации
- Шаблон AOT-компиляции для Minimal API
-
WebApplication.CreateBuilderСравнение сCreateSlimBuilder - Изучение нового генератора исходного кода для Minimal API
- Замена вызовов методов перехватчиками
-
За
[LogProperties]и новым генератором источников журналов телеметрии
ASP.NET Core