۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از فشرده سازی پاسخ در ASP.NET Core

از میان افزار فشرده سازی پاسخ در ASP.NET Core برای کاهش پهنای باند مورد نیاز و بهبود پاسخگویی برنامه های خود استفاده کنید.

از میان افزار فشرده سازی پاسخ در ASP.NET Core برای کاهش پهنای باند مورد نیاز و بهبود پاسخگویی برنامه های خود استفاده کنید.

به عنوان یک چارچوب وب کاملاً مدرن، ASP.NET Core دارای پشتیبانی داخلی برای فشرده سازی پاسخ است که به شما امکان می دهد اندازه پاسخ ها را کاهش دهید و زمان پاسخ را کوتاه کنید. در این مقاله نحوه فشرده سازی پاسخ را بررسی خواهیم کرد و چگونه می توانیم از مزایای میان افزار فشرده سازی پاسخ در ASP.NET Core استفاده کنیم.

فشرده سازی یک راه آسان برای کاهش ترافیک شبکه و افزایش سرعت ارتباط بین منابع وب سرور و مشتریان یا مصرف کنندگان است. الگوریتم های محبوب موجود برای دستیابی به این فشرده سازی عبارتند از Brotli، Gzip، و Deflate، و اکثر مرورگرهای وب امروزی از فشرده سازی پاسخ پشتیبانی می کنند. میان‌افزار فشرده‌سازی پاسخ ASP.NET Core به طور پیش‌فرض از فشرده‌سازی Brotli یا Gzip استفاده می‌کند، بسته به اینکه کدام مورد توسط مشتری پشتیبانی می‌شود.

در اینجا فشرده سازی پاسخ را با استفاده از میان افزار پیاده سازی می کنیم. توجه داشته باشید که اگر برنامه ASP.NET Core شما بر روی یک سرور وب IIS، Apache یا Nginx مستقر شده است، باید در عوض برای عملکرد بهتر از فشرده سازی داخلی ارائه شده توسط وب سرور استفاده کنید. فقط در صورتی از میان‌افزار فشرده‌سازی پاسخ استفاده کنید که نمی‌توانید از فشرده‌سازی سرور وب استفاده کنید، یا اگر برنامه شما روی سرور وب میزبانی می‌شود که فشرده‌سازی داخلی ندارد، مانند Kestrel.

توجه داشته باشید که خط لوله برنامه در ASP.NET Core شامل یک سری درخواست نمایندگی است که به صورت متوالی فراخوانی می شوند. ما از یکی از این مؤلفه‌های میان‌افزار برای اجرای فشرده‌سازی درخواست استفاده خواهیم کرد. خط لوله میان افزار در فایل Program.cs پیکربندی شده است. اینجا جایی است که می توانید خط لوله ASP.NET Core خود را به هم متصل کنید. در بخش‌های بعدی بیشتر درباره این موضوع بحث خواهیم کرد.

یک پروژه ASP.NET Core minimal Web API در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید یک پروژه ASP.NET Core 7 حداقل Web API در Visual Studio 2022 ایجاد کنیم. این مراحل را دنبال کنید:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 7.0 (Current)» را به عنوان چارچوب انتخاب کنید و تیک کادری که می گوید «استفاده از کنترلرها…» را بردارید، در این مثال از حداقل API استفاده خواهیم کرد. تنظیم «نوع احراز هویت» را روی «هیچ» (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس‌های “Enable Docker”، “Configure for HTTPS” و “Enable Open Open API Support” همه علامت‌گذاری نشده باشند. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.
عملی با SolidJS

بعد، بسته فشرده سازی پاسخ مایکروسافت را از طریق NuGet Package Manager در پروژه ASP.NET Core مینیمال Web API که به تازگی ایجاد کرده اید. از زمان نوشتن این مقاله، آخرین نسخه پایدار بسته ResponseCompression 2.2.0 است.

> Install-Package Microsoft.AspNetCore.ResponseCompression -Version 2.2.0

ما از این پروژه ASP.NET Core 7 حداقل Web API برای اجرای فشرده‌سازی پاسخ در بخش‌های زیر استفاده خواهیم کرد.

فشرده سازی پاسخ را در ASP.NET Core پیکربندی کنید

می توانید فشرده سازی پاسخ را در فایل Program.cs با استفاده از کد زیر فعال کنید.

builder.Services.AddResponseCompression();

قطعه کد بالا خدمات فشرده سازی پاسخ را به ظرف اضافه می کند. اگر می‌خواهید فشرده‌سازی پاسخ را برای HTTPS فعال کنید، باید کد زیر را در فایل Program.cs وارد کنید:

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
});

برای افزودن میانافزار فشرده سازی پاسخ به خط لوله پردازش درخواست، به منظور فشرده سازی پاسخ ها به صورت پویا، باید خط لوله درخواست HTTP را با استفاده از کد زیر پیکربندی کنید.

app.UseResponseCompression();

ارائه دهندگان فشرده سازی را برای عملکرد بهینه پیکربندی کنید

توجه داشته باشید که هنگامی که یک ارائه دهنده فشرده سازی اضافه کردید، هیچ ارائه دهنده فشرده سازی دیگری به طور خودکار اضافه نخواهد شد. شما باید کد خود را بنویسید تا در صورت نیاز آنها را اضافه کنید.

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});

می‌توانید ارائه‌دهندگان فشرده‌سازی Brotli و Gzip را برای عملکرد بهینه (به معنای فشرده‌سازی سریع‌تر، اما بار بزرگ‌تر) پیکربندی کنید، همانطور که در قطعه کد زیر نشان داده شده است.

builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Fastest;
});
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Optimal;
});

کد منبع کامل فایل Program.cs

در اینجا کد منبع کامل فایل Program.cs برای مرجع شما آمده است.

using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});
builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Fastest;
});
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Optimal;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseResponseCompression();
app.MapGet("/", () => "Hello World!");
app.Run();

یک ارائه دهنده فشرده سازی سفارشی در ASP.NET Core ایجاد کنید

همچنین می توانید ارائه دهندگان فشرده سازی و رفع فشرده سازی خود را در ASP.NET Core حداقل API ایجاد کنید.

Google API LLM ها را به دستگاه های اندروید و iOS می آورد

برای ایجاد یک ارائه دهنده فشرده سازی سفارشی، ابتدا کلاسی ایجاد کنید که رابط ICompressionProvider را مطابق شکل زیر پیاده سازی کند.

public class CustomCompressionProvider : ICompressionProvider
{
    public Stream CreateStream(Stream outputStream)
    {
        // Write your code here to compress
        return outputStream;
    }
}

بعد با استفاده از کد زیر، ارائه‌دهنده فشرده‌سازی سفارشی را در Program.cs ثبت و پیکربندی کنید.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCompression(options =>
{
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
});
var app = builder.Build();
app.UseResponseCompression();
app.MapGet("/", () => "Hello World!");
app.Run();

یک کنترلر را در ASP.NET Core پیاده سازی کنید

اکنون که فشرده‌سازی پاسخ در پروژه نصب و پیکربندی شده است، اجازه دهید یک کنترل‌کننده برای نشان دادن فشرده‌سازی پاسخ پیاده‌سازی کنیم. برای این کار پوشه Controllers solution پروژه خود را انتخاب کنید و سپس روی Add -> Controller کلیک کنید. الگوی “API Controller – Empty” را از لیست الگوهای نمایش داده شده در پنجره افزودن داربست انتخاب کنید و وقتی از شما خواسته شد نام برای کنترلر وارد کنید. سپس کد پیش فرض را با کد زیر جایگزین کنید.

[Produces("application/json")]
    [Route("api/Default")]
    public class DefaultController : Controller
    {
        // GET: api/Default
        [HttpGet]
        public List<Message> Get()
        {
            List<Message> lst = new List<Message>();
            for(int index=0; index <100; index++)
            {
                Message message = new Message();
                message.Text = “This is a text message.”;
                lst.Add(message);
            }
            return lst;
        }
    }

کلاس Message فقط دارای یک ویژگی رشته است.

public class Message
    {
        public string Text { get; set; }
    }

وقتی این روش کنترلر را اجرا کردم، می‌توانستم ببینم که اندازه پاسخ فشرده ۰.۰۹۱ کیلوبایت است. وقتی فشرده سازی غیرفعال شد، اندازه پاسخ ۳.۴۱۹ کیلوبایت بود. برای غیرفعال کردن فشرده‌سازی پاسخ، می‌توانید به سادگی خطوط مناسب را در فایل Program.cs نظر دهید.

//builder.Services.AddResponseCompression();
//app.UseResponseCompression();

برای اینکه فشرده سازی پاسخ کار کند، کلاینت باید با ارسال هدر Accept-Encoding به همراه درخواست، سرور را از قابلیت های خود مطلع کند. سرور نیز به نوبه خود باید این هدر را با پاسخ فشرده در بر بگیرد تا به مشتری اطلاع دهد که پاسخ فشرده شده است.

چگونه چنگال گیت مایکروسافت برای مونورپوهای عظیم مقیاس می‌شود

توجه داشته باشید که اگرچه فشرده‌سازی پاسخ در ASP.NET Core انعطاف‌پذیر، پیکربندی آسان و استفاده آسان است، اما کندتر از فشرده‌سازی IIS است. هر زمان که می توانید می خواهید به فشرده سازی ارائه شده توسط IIS و سایر سرورهای وب اعتماد کنید. می‌توانید درباره فشرده‌سازی پاسخ در ASP.NET Core از مستندات هسته ASP.NET مایکروسافت.

استفاده از فشرده سازی HTTPS

توجه داشته باشید که فشرده سازی از طریق HTTPS می تواند داده های حساس را در معرض حملات CRIME و BREACH قرار دهد. مهاجم می تواند ترافیک فشرده سازی HTTPS را برای سرقت اطلاعات کاربری یا کوکی های جلسه رهگیری کند و امنیت برنامه را به خطر بیندازد. می توانید با پیکربندی وب سرور برای استفاده از TLS به جای فشرده سازی HTTPS از چنین حملاتی جلوگیری کنید.

فشرده‌سازی TLS داده‌ها را در لایه‌ای بالاتر از HTTPS فشرده می‌کند و سوء استفاده از آن را برای مهاجمان سخت‌تر می‌کند. بر خلاف تکنیک های فشرده سازی سنتی که محتوا را در لایه برنامه فشرده می کند، فشرده سازی TLS داده ها را در لایه انتقال فشرده می کند.