Output Caching یک ویژگی جدید است که از زمان .NET 7 معرفی شده است. این ویژگی به ما این امکان را می دهد که به راحتی یک کش پاسخ برای Web API خود بدون پیاده سازی IMemoryCache راه اندازی کنیم.
در این مقاله نحوه پیاده سازی و استفاده از Output Caching در ASP.NET Core 8 را بررسی می کنیم.
می توانید ویدیو بررسی و پیاده سازی Output Caching در ASP.NET Core 8 را در یوتیوب کدسل مشاهده کنید.
Output Caching چیست؟
Output Caching تکنیکی است که میتوانیم آن را در ASP.NET Core برای کش کردن دادههایی که اغلب به آنها دسترسی پیدا میکنید، عمدتاً برای بهبود عملکرد اعمال کنیم. با جلوگیری از call های بیش از حد به وابستگیهای شدید منابع (مثلاً یک پایگاه داده یا تماس شبکه)، میتوانیم زمان پاسخگویی برنامهمان را که یکی از کلیدهای اصلی مقیاسسازی برنامهها است، به طرز چشمگیری بهبود ببخشیم.
تفاوت بین Output Caching و Response Caching
قبل از اینکه به نحوه عملکرد Output Caching خروجی بپردازیم، بیایید تفاوت های اصلی بین Output Caching و Response Caching را بررسی کنیم:
Responsibility: response caching، مسئولیت کش را به مشتریان (یا سرورهای پروکسی واسطه) با تنظیم هدرهای کش منتقل می کند. Output Caching مسئولیت را بر عهده سرور (یا مجموعه ای از سرورها) می گذارد.
محیط ذخیره سازی: response caching در memory ذخیره می شود، در حالی که output caching گزینه های مختلفی برای سفارشی کردن فضای ذخیره سازی دارد.
Eviction: از آنجایی که ما output caching را در سرور کنترل می کنیم، گزینه هایی برای حذف این ورودی های کش داریم. با این حال این مورد در Response caching بسیار دشوار است، زیرا ما کنترل نمی کنیم که کلاینت ها چگونه می توانند رفتار کنند.
اعتبار سنجی مجدد: output caching می تواند یک کد پاسخ 304 Not Modified را به جای بدنه پاسخ کش شده برگرداند. این موضوع می تواند در پهنای باند صرفه جویی کند.
این تفاوت ها یکی را بهتر از دیگری نمی کند، زیرا هر کدام موارد استفاده متفاوتی دارند.
پیکربندی Output Caching در NET8
ابتدا باید OutputCache را به کانتینر سرویس در فایل Program.cs اضافه کنیم:
builder.Services.AddOutputCache();
بعد، باید میان افزار OutputCache را نیز اضافه کنیم:
app.UseOutputCache();
فایل کامل Program.cs در زیر آمده است:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOutputCache();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseOutputCache();
app.MapControllers();
app.Run();
پیاده سازی Output Caching در NET8
برای فعال کردن کش خروجی، میتوانیم action method را با ویژگی [OutputCache] تزئین کنیم:
[HttpGet]
[OutputCache]
public async Task<IActionResult> Get(CancellationToken ct)
{
// ...
}
به طور پیش فرض، مدت زمان کش 60 ثانیه است. برای سفارشی کردن مدت زمان کش، میتوانیم ویژگی Duration را تنظیم کنیم:
[HttpGet]
[OutputCache(Duration = 10)] // 10 seconds cache duration
public async Task<IActionResult> Get(CancellationToken ct)
{
// ...
}
کد بالا مدت زمان کش را روی 10 ثانیه تنظیم می کند.
اگر در عرض 10 ثانیه دوباره به اندپوینت برسیم، به جای اجرای مجدد منطق، پاسخ کش شده را بر میگرداند.
سفارشی سازی زمان انقضای پیش فرض
میتوانیم زمان انقضای کش پیش فرض را با تنظیم ویژگی DefaultExpirationTimeSpan تغییر دهیم:
builder.Services.AddOutputCache(opt =>
{
opt.DefaultExpirationTimeSpan = TimeSpan.FromSeconds(30);
});
نحوه تعریف Policy برای Output Caching
ما همچنین می توانیم یک Policy برای سفارشی سازی output caching ایجاد کنیم. برای مثال، میخواهیم کش را برای اندپوینت master data را روی 10 ثانیه تنظیم کنیم در حالی که کش برای اندپوینت reports روی 60 ثانیه است.
builder.Services.AddOutputCache(opt =>
{
opt.DefaultExpirationTimeSpan = TimeSpan.FromSeconds(30);
opt.AddPolicy("MasterData", builder => builder.Expire(TimeSpan.FromSeconds(10)));
opt.AddPolicy("Reports", builder => builder.Expire(TimeSpan.FromSeconds(60)));
});
برای استفاده از این Policy، می توانیم ویژگی PolicyName را در ویژگی OutputCache تنظیم کنیم:
[HttpGet]
[OutputCache(PolicyName = "Reports")]
public async Task<IActionResult> Get(int year, int month, CancellationToken ct)
{
// ...
}
[HttpGet]
[OutputCache(PolicyName = "MasterData")]
public async Task<IActionResult> Get(CancellationToken ct)
{
// ...
}
نتیجه گیری
در این مقاله به نحوه راه اندازی OutputCache در ASP.NET پرداختیم. برای اکثر سناریوهای خود می توانیم از پیشفرضها، از جمله استفاده از memory cache به عنوان storage پیشفرض، استفاده کنیم. با این حال، همانطور که سرورهای خود را بزرگ می کنیم، این کمتر ایده آل می شود. برای این موارد، گزینه های بهتری از جمله انتخاب ابزاری مانند Redis وجود دارد. این به ما این امکان را می دهد که از مزایای عملکرد کش در حین آزاد کردن منابع حافظه در سرورهای خود استفاده کنیم.
به یاد داشته باشید که Output Caching با Response Caching بسیار متفاوت است. در Output Caching، بیشتر تلاش ما روی سرور است، اطمینان حاصل می کنیم که آیتم ها بر اساس گزینه های مختلف ذخیره می شوند و در صورت نیاز، از حافظه کش خارج می شوند. این کنترل سمت سرور در قلب Output Caching قرار دارد و کلاینت ها حداقل کنترل را دارند. در مقابل، Response Caching به این موضوع میپردازد که چگونه به کلاینتها دستور دهید تا کش کنند، زیرا سرور اصلاً حالتی ندارد. در حالت ایده آل، ما باید هر دو تکنیک را ترکیب کنیم تا یک برنامه کاربردی خوب داشته باشیم.
برای ثبت نظر باید در سایت ثبت نام یا ورود نمایید