Минимальные 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. Следуй этим шагам:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и расположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В окне «Дополнительная информация», показанном далее, выберите «NET 7.0 (Current)» в качестве платформы и снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальное количество API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить поддержку Open API» сняты. Мы не будем использовать ни одну из этих функций здесь.
- Щелкните Создать.
Мы будем использовать этот проект веб-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 выдадут исключение с соответствующим сообщением об ошибке, в котором будет сказано, что метод сжатия не поддерживается.