Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1203. #ЧтоНовенького Превью 4 Обновлений ASP.NET Core в .NET 7. Продолжение Продолжаем рассматривать обновления ASP.NET Core в превью 4 .NET 7. Начало 3. Возврат нескольких типов результатов из минимальных API Новые обобщённые объединяющие типы Results<TResult1, TResult2, TResultN> вместе с классом TypesResults можно использовать для объявления того, что обработчик маршрута возвращает несколько конкретных типов, реализующих IResult. Любые из этих типов, реализующие IEndpointMetadataProvider, добавят метаданные для конечной точки, позволяя платформе автоматически добавлять описания типов HTTP-результатов для API в OpenAPI/Swagger:
app.MapGet("/todos/{id}", 
  async Results<Ok<Todo>, NotFound> (int id, TodoDb db)
{
  return await db.Todos.FindAsync(id) is Todo todo
    ? TypedResults.Ok(todo)
    : TypedResults.NotFound();
});

В этом случае в описании OpenAPI/Swagger этот метод будет иметь 2 типа типов HTTP-результата: HTTP 200 OK и HTTP 404 NotFound. Объединяющие типы Results<TResult1, TResultN> реализуют операторы неявного приведения, чтобы компилятор мог автоматически преобразовывать типы, указанные в обобщённых аргументах, в экземпляр объединяющего типа. Это даёт дополнительное преимущество. Во время компиляции проверяется, что обработчик маршрута на самом деле возвращает только те результаты, которые он декларирует. Попытка вернуть тип, который не объявлен как один из обобщённых аргументов в Results<>, приведет к ошибке компиляции. 4. Промежуточное ПО для ограничений Предоставляет удобный способ задания ограничений для входящих HTTP-запросов. Например, ConcurrencyLimiter позволяет ограничить количество одновременных входящих запросов:
app.UseRateLimiter(new RateLimiterOptions
{
  Limiter = PartitionedRateLimiter
   .Create<HttpContext, string>(resource =>
  {
    return RateLimitPartition
     .CreateConcurrencyLimiter("MyLimiter",
       _ => new ConcurrencyLimiterOptions(
        2, QueueProcessingOrder.NewestFirst, 3));
  })
});

Строка, переданная в качестве первого аргумента CreateConcurrencyLimiter, - это ключ, чтобы различать разные ограничители в PartitionedRateLimiter. В этом примере используется ConcurrencyLimiter с ограничением в 2 одновременных доступа, параметром, указывающим, что запросы должны обрабатываться по очереди по мере поступления и параметром, задающим размер очереди в 3 запроса. На данный момент RateLimitPartition содержит методы для создания ConcurrencyLimiter, TokenBucketRateLimiter и NoopLimiter, которые используются аналогично примеру выше. Подробнее про возможности ограничителя рассказывает Ник Чапсас в своём недавнем видео. Реализация ограничений в превью 4 .NET 7 пока минимальна и не поддерживает раздельные конечные точки. В будущем планируется это реализовать, а также добавить дополнительные параметры конфигурации. Пока можно использовать System.Threading.RateLimiting для создания PartitionedRateLimiter, который может применять различные ограничения к различным конечным точкам. Источник: devblogs.microsoft.com/dotnet/…review-4