Основная часть ноябрьского выпуска Microsoft .NET 7, ориентированного на облачные технологии, ASP.NET Core 7 привносит новые мощные инструменты в среду веб-разработки, чтобы помочь разработчикам создавать современные веб-приложения. Построенный на основе среды выполнения .NET Core, ASP.NET Core 7 имеет все необходимое для создания передовых пользовательских веб-интерфейсов и надежных серверных служб в Windows, Linux и macOS.
В этой статье обсуждаются самые важные особенности ASP.NET Core 7 и приводятся примеры кода, которые помогут вам начать работу с новыми функциями. Для работы с примерами кода, приведенными в этой статье, на вашем компьютере должна быть установлена Visual Studio 2022. Если у вас нет копии, вы можете скачать Visual Studio 2022 здесь.
Теперь давайте углубимся в лучшие новые функции ASP.NET Core 7.
ПО промежуточного слоя для кэширования вывода
ASP.NET Core 7 позволяет использовать кэширование вывода во всех приложениях ASP.NET Core: Minimal API, MVC, Razor Pages и приложениях веб-API с контроллерами. Чтобы добавить ПО промежуточного слоя для кэширования вывода в коллекцию служб, вызовите метод расширения IServiceCollection.AddOutputCache. Чтобы добавить ПО промежуточного слоя в конвейер обработки запросов, вызовите метод расширения IApplicationBuilder.UseOutputCache.
Затем, чтобы добавить слой кэширования в конечную точку, вы можете использовать следующий код.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("https://www.infoworld.com/", () => "Hello World!").CacheOutput(); app.Run();
Промежуточное ПО для ограничения скорости
Контроль скорости, с которой клиенты могут отправлять запросы к конечным точкам, является важной мерой безопасности, которая позволяет веб-приложениям отражать вредоносные атаки. Вы можете предотвратить атаки типа «отказ в обслуживании», например, ограничив количество запросов, поступающих с одного IP-адреса в определенный период времени. Термин для этой возможности — ограничение скорости.
ПО промежуточного слоя Microsoft.AspNetCore.RateLimiting в ASP.NET Core 7 может помочь вам применить ограничение скорости в вашем приложении. Вы можете настроить политики ограничения скорости, а затем прикрепить эти политики к конечным точкам, тем самым защитив эти конечные точки от атак типа «отказ в обслуживании». Это промежуточное ПО особенно полезно для общедоступных веб-приложений, которые подвержены таким атакам.
Вы можете использовать ПО промежуточного слоя для ограничения скорости с приложениями ASP.NET Core Web API, ASP.NET Core MVC и ASP.NET Core Minimal API. Чтобы начать использовать это встроенное ПО промежуточного слоя, добавьте пакет NuGet Microsoft.AspNetCore.RateLimiting в свой проект, выполнив следующую команду в командной строке Visual Studio.
dotnet add package Microsoft.AspNetCore.RateLimiting
Кроме того, вы можете добавить этот пакет в свой проект, выполнив следующую команду в консоли диспетчера пакетов NuGet или в окне консоли:
Install-Package Microsoft.AspNetCore.RateLimiting
После установки промежуточного программного обеспечения ограничения скорости включите приведенный ниже фрагмент кода в файл Program.cs, чтобы добавить службы ограничения скорости с конфигурацией по умолчанию.
builder.Services.AddRateLimiter(options => { });
Промежуточное ПО для распаковки запросов
ASP.NET Core 7 включает новое промежуточное ПО для распаковки запросов, которое позволяет конечным точкам принимать запросы со сжатым содержимым. Это устраняет необходимость в явном написании кода для распаковки запросов со сжатым содержимым. Он работает с использованием HTTP-заголовка Content-Encoding для идентификации и распаковки сжатого содержимого в HTTP-запросах.
В ответ на HTTP-запрос, соответствующий значению заголовка Content-Encoding, ПО промежуточного слоя инкапсулирует HttpRequest.Body в подходящий поток распаковки с использованием соответствующего поставщика. Затем следует удаление заголовка Content-Encoding, указывающего на то, что тело запроса больше не сжимается. Обратите внимание, что промежуточное ПО распаковки запросов игнорирует запросы без заголовка Content-Encoding.
Фрагмент кода ниже показывает, как вы можете включить декомпрессию запроса для типов Content-Encoding по умолчанию.
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRequestDecompression(); var app = builder.Build(); app.UseRequestDecompression(); app.MapPost("https://www.infoworld.com/", (HttpRequest httpRequest) => Results.Stream(httpRequest.Body)); app.Run();
Поставщиками декомпрессии по умолчанию являются форматы сжатия Brotli, Deflate и Gzip. Их значения заголовка Content-Encoding — br, deflate и gzip соответственно.
Фильтры в минимальных API
Фильтры позволяют выполнять код на определенных этапах конвейера обработки запросов. Фильтр запускается до или после выполнения метода действия. Вы можете воспользоваться фильтрами для отслеживания посещений веб-страниц или проверки параметров запроса. Используя фильтры, вы можете сосредоточиться на бизнес-логике вашего приложения, а не на написании кода для сквозных задач в вашем приложении.
Фильтр конечной точки позволяет вам перехватывать, изменять, сокращать и объединять сквозные проблемы, такие как авторизация, проверка и обработка исключений. Новый интерфейс IEndpointFilter в ASP.NET Core 7 позволяет нам разрабатывать фильтры и подключать их к конечным точкам API. Эти фильтры могут изменить объекты запроса или ответа или сократить обработку запроса. Фильтр конечных точек можно вызывать для действий и конечных точек маршрута.
Интерфейс IEndpointFilter определен в пространстве имен Microsoft.AspNetCore.Http, как показано ниже.
public interface IEndpointFilter { ValueTask<object?> InvokeAsync( EndpointFilterInvocationContext context, EndpointFilterDelegate next); }
В следующем фрагменте кода показано, как несколько фильтров конечных точек могут быть объединены в цепочку.
app.MapGet("https://www.infoworld.com/", () => { return "Demonstrating multiple endpoint filters."; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 1st filter."); var result = await next(endpointFilterInvocationContext); return result; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 2nd filter."); var result = await next(endpointFilterInvocationContext); return result; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 3rd Filter."); var result = await next(endpointFilterInvocationContext); return result; });
Привязка параметров в методах действий с использованием внедрения зависимостей
В ASP.NET Core 7 вы можете воспользоваться внедрением зависимостей для привязки параметров в методах действий ваших контроллеров API. Итак, если тип настроен как служба, вам больше не нужно добавлять [FromServices] атрибут к параметрам вашего метода. Следующий фрагмент кода иллюстрирует это.
[Route("[controller]")] [ApiController] public class MyDemoController : ControllerBase { public ActionResult Get(IDateTime dateTime) => Ok(dateTime.Now); }
Типизированные результаты в минимальных API
Интерфейс IResult был добавлен в .NET 6 для представления значений, возвращаемых из минимальных API-интерфейсов, которые не используют неявную поддержку сериализации возвращаемого объекта в формате JSON. Здесь следует отметить, что статический класс Result используется для создания различных объектов IResult, которые представляют разные типы ответов, например, установка кода состояния возврата или перенаправление пользователя на новый URL-адрес. Однако, поскольку типы платформы, возвращаемые этими методами, были закрытыми, было невозможно проверить правильный тип IResult, возвращаемый методами действия во время модульного тестирования.
В .NET 7 типы фреймворка, реализующие интерфейс IResult, теперь общедоступны. Таким образом, мы можем использовать утверждения типа при написании наших модульных тестов, как показано во фрагменте кода, приведенном ниже.
[TestClass()] public class MyDemoApiTests { [TestMethod()] public void MapMyDemoApiTest() { var result = _MyDemoApi.GetAllData(); Assert.IsInstanceOfType(result, typeof(Ok<MyDemoModel[]>)); } }
Вы также можете использовать типы реализации IResult для модульного тестирования обработчиков маршрутов в минимальных API. Следующий фрагмент кода иллюстрирует это.
var result = (Ok<MyModel>)await _MyDemoApi.GetAllData()
Группы маршрутов в минимальных API
В ASP.NET Core 7 вы можете использовать новый метод расширения MapGroup для организации групп конечных точек с общим префиксом в ваших минимальных API. Метод расширения MapGroup не только сокращает повторяющийся код, но и упрощает настройку целых групп конечных точек.
В следующем фрагменте кода показано, как можно использовать MapGroup.
app.MapGroup("/public/authors") .MapAuthorsApi() .WithTags("Public");
Следующий фрагмент кода иллюстрирует метод расширения MapAuthorsApi.
public static class MyRouteBuilder { public static RouteGroupBuilder MapAuthorsApi(this RouteGroupBuilder group) { group.MapGet("https://www.infoworld.com/", GetAllAuthors); group.MapGet("/{id}", GetAuthor); group.MapPost("https://www.infoworld.com/", CreateAuthor); group.MapPut("/{id}", UpdateAuthor); group.MapDelete("/{id}", DeleteAuthor); return group; } }
Проверки работоспособности для gRPC
ASP.NET Core поддерживает использование промежуточного программного обеспечения .NET Health Checks для создания отчетов о работоспособности компонентов инфраструктуры вашего приложения. В ASP.NET Core 7 добавлена встроенная поддержка мониторинга работоспособности служб gRPC с помощью пакета NuGet Grpc.AspNetCore.HealthChecks. Вы можете использовать этот пакет для предоставления конечной точки в приложении gRPC, которая позволяет выполнять проверки работоспособности.
Обратите внимание, что вы обычно используете проверки работоспособности с внешней системой мониторинга или с балансировщиком нагрузки или оркестратором контейнеров. Последний может автоматизировать такие действия, как перезапуск или перенаправление службы в зависимости от состояния ее работоспособности. Подробнее о проверках работоспособности ASP.NET Core можно прочитать здесь.
Загрузка файлов в минимальных API
Теперь вы можете использовать IFormFile и IFormFileCollection в минимальных API для отправки файлов в ASP.NET Core 7. В следующем фрагменте кода показано, как можно использовать IFormFile.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapPost("/uploadfile", async (IFormFile iformFile) => { var tempFileName = Path.GetTempFileName(); using var fileStream = File.OpenWrite(tempFileName); await iformFile.CopyToAsync(fileStream); }); app.Run();
Если вы хотите загрузить несколько файлов, вы можете вместо этого использовать следующий фрагмент кода.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapPost("/uploadfiles", async (IFormFileCollection files) => { foreach (var file in files) { var tempFileName = Path.GetTempFileName(); using var fileStream = File.OpenWrite(tempFileName); await file.CopyToAsync(fileStream); } }); app.Run();
От кэширования вывода, ограничения скорости и промежуточного ПО для распаковки запросов до фильтров, карт маршрутов и других новых возможностей для минимальных API — ASP.NET Core 7 предоставляет разработчикам множество новых функций, которые значительно упростят и ускорят создание надежных веб-приложений. ASP.NET Core 7 обеспечивает более быструю разработку с использованием модульных компонентов, обеспечивает более высокую производительность и масштабируемость на нескольких платформах, а также упрощает развертывание на веб-узлах, в Docker, Azure и других средах размещения с помощью встроенных инструментов.
В этой статье мы обсудили лишь некоторые из важных новых функций ASP.NET Core 7 — мои лучшие. Вы можете найти полный список новых функций в ASP.NET Core 7 здесь.