از میانافزار رفع فشردهسازی درخواست در ASP.NET Core 7 استفاده کنید تا نقاط پایانی API خود را قادر به پذیرش درخواستهایی که حاوی محتوای فشردهشده هستند، داشته باشید.
Minimal API ها در ASP.NET Core به شما این امکان را می دهند که به راحتی API های RESTful را با حداقل کد و پیکربندی ایجاد کنید. مهم نیست که چه نوع API ایجاد می کنیم، همیشه مهم است که مقدار داده های منتقل شده از طریق شبکه را به حداقل برسانیم، که باعث صرفه جویی در پهنای باند و بهبود پاسخگویی برنامه می شود. ما این کار را با فشرده سازی بارهای درخواستی و پاسخ ها انجام می دهیم.
البته، این بدان معناست که ما باید آن بارها را در انتهای دیگر از حالت فشرده خارج کنیم. در ASP.NET Core 7، فشردهسازی درخواست خارج از جعبه پشتیبانی میشود: اکنون میتوانید از میانافزار جدید رفع فشردهسازی درخواست استفاده کنید تا نقاط انتهایی API خود را فعال کنید تا درخواستهایی را که دادههای فشرده دارند بپذیرند.
این مقاله به بررسی نحوه کار با فشرده سازی درخواست و رفع فشرده سازی در ASP.NET Core 7 Minimal API می پردازد. (توجه داشته باشید که فشرده سازی پاسخ در ASP.NET Core را در مقاله قبلی مورد بحث قرار دادیم.) برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کرده باشید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه ASP.NET Core 7 Minimal Web API در Visual Studio 2022 ایجاد کنید
ابتدا، اجازه دهید یک پروژه ASP.NET Core 7 در Visual Studio 2022 Preview ایجاد کنیم. این مراحل را دنبال کنید:
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 7.0 (Current)» را به عنوان چارچوب انتخاب کنید و تیک کادری که می گوید «استفاده از کنترلرها…» را بردارید، زیرا در این مثال از حداقل API استفاده خواهیم کرد. تنظیم «نوع احراز هویت» را روی «هیچ» (پیشفرض) بگذارید.
- مطمئن شوید که چک باکس های “Enable Docker”، “Configure for HTTPS” و “Enable Open Open API Support” را علامت نزنید. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
ما از این پروژه ASP.NET Core 7 Web API برای ایجاد یک API حداقل و اجرای فشردهسازی و رفع فشردهسازی درخواست در بخشهای زیر استفاده خواهیم کرد.
در ASP.NET Core 7 درخواست میان افزار رفع فشرده سازی کنید
ASP.NET Core 7 شامل یک میانافزار فشردهسازی درخواست جدید است که به نقاط پایانی اجازه میدهد درخواستهایی را بپذیرند که محتوای فشرده دارند. این امر نیاز به نوشتن کد به طور صریح برای فشرده سازی درخواست ها با محتوای فشرده را از بین می برد.
سربرگ HTTP رمزگذاری محتوا برای شناسایی و فشردهسازی محتوای فشرده در درخواستهای HTTP استفاده میشود. در پاسخ به یک درخواست HTTP که با مقدار سرصفحه Content-Encoding مطابقت دارد، میان افزار رفع فشرده سازی درخواست HttpRequest.Body را با استفاده از ارائه دهنده تطبیق در یک جریان رفع فشرده سازی مناسب کپسوله می کند.
به دنبال این کار، سربرگ Content-Encoding حذف میشود، که نشان میدهد بدنه درخواست دیگر فشرده نشده است. توجه داشته باشید که میانافزار رفع فشردهسازی درخواست درخواستها را بدون هدر Content-Encoding نادیده میگیرد.
به عبارت دیگر، وقتی مقدار هدر Content-Encoding یک درخواست HTTP با هر یک از ارائه دهندگان رفع فشرده سازی موجود مطابقت دارد، میان افزار رفع فشرده سازی درخواست از یک ارائه دهنده منطبق استفاده می کند تا بدنه درخواست را در یک جریان رفع فشرده سازی مناسب بپیچد. و هدر Content-Encoding را حذف می کند تا نشان دهد که بدنه درخواست دیگر فشرده نشده است.
ویژگی های میان افزار رفع فشرده سازی درخواست در ASP.NET Core 7 در یک نگاه:
- نقاط پایانی API را قادر میسازد تا درخواستهایی را بپذیرند که حاوی دادههای فشرده هستند.
- از هدر HTTP کدگذاری محتوا برای تعیین و از حالت فشرده خارج کردن دادههای مربوط به درخواستهایی که دارای محتوای فشرده هستند استفاده میکند.
- نیاز به نوشتن هر کدی برای رسیدگی به رفع فشرده سازی درخواست هایی که حاوی داده های فشرده هستند را از بین می برد.
ارائه دهندگان رفع فشرده سازی که به طور پیش فرض پشتیبانی می شوند عبارتند از Brotli، Deflate و GZip. ارائهدهندههای پیشفرض رفع فشردهسازی و مقادیر هدر کدگذاری محتوای متناظر آنها در زیر آورده شدهاند:
<جدول>
ارائهدهنده فشردهسازی
مقدار سرصفحه
بروتلی
br
باد کردن
Gzip
ارائهدهنده فشردهسازی
مقدار سرصفحه
بروتلی
br
باد کردن
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("/", (HttpRequest httpRequest) => Results.Stream(httpRequest.Body)); app.Run();
درخواست محدودیت اندازه
برای جلوگیری از بمبهای فشرده یا بمبهای فشردهسازی، حداکثر اندازه دادههای فشردهشده به اندازه بدنه درخواست محدود میشود. اگر اندازه محتوای فشردهشده از این حد بیشتر شود، یک InvalidOperationException پرتاب میشود.
بمبهای فشرده، که به عنوان بمبهای رفع فشار نیز شناخته میشوند، فایلهای مخربی هستند که حاوی مقدار زیادی داده بسیار فشرده هستند. یک بمب فشرده استخراج شده یا فشرده شده به شدت گسترش می یابد، مقدار زیادی از حافظه و فضای دیسک را مصرف می کند و به طور بالقوه باعث حمله انکار سرویس (DoS) می شود.
ایجاد یک ارائه دهنده فشرده سازی سفارشی در ASP.NET Core 7
برای پشتیبانی از رمزگذاریهای سفارشی، میتوانید ارائهدهندههای فشردهسازی خود را در ASP.NET Core 7 Minimal API ایجاد کنید. برای انجام این کار، باید کلاسی ایجاد کنید که رابط 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("/", (HttpRequest request) => Results.Stream(request.Body)); app.Run();
من منطق فشرده سازی و رفع فشرده سازی سفارشی را در اینجا پیاده سازی نکرده ام. من به زودی این را در یک مقاله بعدی نشان خواهم داد.
اگر میان افزار رفع فشرده سازی درخواست نتواند محتوای فشرده درخواست را از حالت فشرده خارج کند، درخواست را به نماینده بعدی ارسال می کند. هر زمان که درخواستی حاوی مقدار سرصفحه Content-Encoding پشتیبانی نشده باشد یا حاوی چندین مقدار سرصفحه Content-Encoding باشد، به نماینده بعدی ارسال می شود. و Brotli، GZip و Deflate یک استثنا با یک پیغام خطای مناسب پرتاب میکنند که بیان میکند که روش فشردهسازی پشتیبانی نمیشود.
پست های مرتبط
نحوه استفاده از فشرده سازی درخواست در ASP.NET Core 7
نحوه استفاده از فشرده سازی درخواست در ASP.NET Core 7
نحوه استفاده از فشرده سازی درخواست در ASP.NET Core 7