Как использовать распаковку запроса в ASP.NET Core 7

автор red


Минимальные API в ASP.NET Core позволяют легко создавать RESTful API с минимальным кодом и конфигурацией. Независимо от того, какой тип API мы создаем, всегда важно свести к минимуму объем данных, передаваемых по сети, что экономит пропускную способность и повышает скорость отклика приложения. Мы делаем это, сжимая полезные данные как запросов, так и ответов.

Конечно, это означает, что мы должны распаковать эти полезные нагрузки на другом конце. В ASP.NET Core 7 декомпрессия запросов поддерживается по умолчанию: теперь вы можете использовать новое промежуточное ПО для декомпрессии запросов, чтобы ваши конечные точки API могли принимать запросы со сжатыми данными.

В этой статье рассматривается, как вы можете работать со сжатием и распаковкой запросов в минимальных API-интерфейсах ASP.NET Core 7. (Обратите внимание, что мы обсуждали сжатие ответов в ASP.NET Core в предыдущей статье.) Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект минимального веб-API ASP.NET Core 7 в Visual Studio 2022.

Прежде всего, давайте создадим проект ASP.NET Core 7 в Visual Studio 2022 Preview. Следуй этим шагам:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и расположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В окне «Дополнительная информация», показанном далее, выберите «NET 7.0 (Current)» в качестве платформы и снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальное количество API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить поддержку Open API» сняты. Мы не будем использовать ни одну из этих функций здесь.
  10. Щелкните Создать.

Мы будем использовать этот проект веб-API ASP.NET Core 7 для создания минимального API и реализации сжатия и распаковки запросов в следующих разделах.

ПО промежуточного слоя для распаковки запросов в ASP.NET Core 7

ASP.NET Core 7 включает новое промежуточное ПО для распаковки запросов, которое позволяет конечным точкам принимать запросы со сжатым содержимым. Это устраняет необходимость в явном написании кода для распаковки запросов со сжатым содержимым.

HTTP-заголовок Content-Encoding используется для идентификации и распаковки сжатого содержимого в HTTP-запросах. В ответ на HTTP-запрос, который соответствует значению заголовка Content-Encoding, ПО промежуточного слоя распаковки запроса инкапсулирует HttpRequest.Body в подходящий поток распаковки с использованием соответствующего поставщика.

Затем следует удаление заголовка Content-Encoding, указывающего на то, что тело запроса больше не сжимается. Обратите внимание, что промежуточное ПО распаковки запросов игнорирует запросы без заголовка Content-Encoding.

Другими словами, когда значение заголовка Content-Encoding HTTP-запроса совпадает с любым из доступных провайдеров декомпрессии, промежуточное ПО декомпрессии запроса использует преимущества соответствующего провайдера, чтобы обернуть тело запроса в соответствующий поток декомпрессии и удалить Заголовок Content-Encoding, указывающий, что тело запроса больше не сжимается.

Краткий обзор функций промежуточного программного обеспечения для распаковки запросов в ASP.NET Core 7:

  • Он позволяет конечным точкам API принимать запросы, содержащие сжатые данные.
  • Он использует HTTP-заголовок Content-Encoding для определения и распаковки данных, относящихся к запросам со сжатым содержимым.
  • Это избавляет от необходимости писать какой-либо код для обработки распаковки запросов, содержащих сжатые данные.

Поставщики декомпрессии, поддерживаемые по умолчанию, включают Brotli, Deflate и GZip. Поставщики декомпрессии по умолчанию и соответствующие им значения заголовков кодирования содержимого приведены ниже:

Поставщик сжатия

Значение заголовка

Бротли

бр

Выкачать

сдувать

Gzip

gzip

Очевидно, что все эти поставщики сжатия также поддерживаются промежуточным программным обеспечением для сжатия ответов в ASP.NET Core 7. Вы можете использовать промежуточное ПО для распаковки запросов в ASP.NET Core 7, используя метод расширения UseRequestDecompression, который расширяет интерфейс IApplicationBuilder, и вызывая метод расширения AddRequestDecompression в интерфейсе IServiceCollection.

Включить ПО промежуточного слоя для распаковки запросов в ASP.NET Core 7

В следующем фрагменте кода показано, как включить декомпрессию запроса для типов 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();

Ограничения размера запроса

Чтобы предотвратить «молниеносные бомбы» или декомпрессионные бомбы, максимальный размер распакованных данных ограничен размером тела запроса. Если размер распакованного содержимого превышает этот предел, создается исключение InvalidOperationException.

Zip-бомбы, также известные как декомпрессионные бомбы, представляют собой вредоносные файлы, содержащие большое количество сильно сжатых данных. Извлеченная или распакованная zip-бомба сильно расширяется, потребляя большой объем памяти и дискового пространства и потенциально вызывая атаку типа «отказ в обслуживании» (DoS).

Создание собственного поставщика распаковки в ASP.NET Core 7

Чтобы обеспечить поддержку пользовательских кодировок, вы можете создать свои собственные поставщики распаковки в минимальных API-интерфейсах ASP.NET Core 7. Для этого вы должны создать класс, реализующий интерфейс IDecompressionProvider, как показано ниже.

public class CustomDecompressionProvider : IDecompressionProvider
{
    public Stream GetDecompressionStream(Stream stream)
    {
        // Write your code here to decompress
        return stream;
    }
}

Затем вы должны зарегистрировать и настроить свой пользовательский поставщик декомпрессии в файле Program.cs, используя следующий код.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression(options =>
{
    options.DecompressionProviders.Add("mycustomdecompressionprovider", new CustomDecompressionProvider());
});
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("https://www.infoworld.com/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();

Я не реализовал здесь логику пользовательского сжатия и распаковки. Я продемонстрирую это в следующей статье в ближайшее время.

Если промежуточное ПО распаковки запроса не может распаковать сжатое содержимое запроса, оно перенаправит запрос следующему делегату. Всякий раз, когда запрос содержит неподдерживаемое значение заголовка Content-Encoding или включает несколько значений заголовка Content-Encoding, он будет перенаправлен следующему делегату. А Brotli, GZip и Deflate выдадут исключение с соответствующим сообщением об ошибке, в котором будет сказано, что метод сжатия не поддерживается.

Related Posts

Оставить комментарий