38a1

Response Caching در ASP.NET Core

لینک کوتاه https://codecell.ir/a/38a1
به اشتراک گذاری
نویسنده:
0
0
0
آموزش های نویسنده:
Response Caching در ASP.NET Core

Response Caching چیست؟

Response Caching یک مکانیزم ذخیره سازی پاسخ سرور توسط مرورگر یا سایر کلاینت ها است. Response Caching به درخواست‌های آینده برای همان منابع کمک می‌کند. علاوه بر این، این کار سرور را از پردازش و ایجاد چندین بار پاسخ یکسان آزاد می کند.

ASP.NET Core از ویژگی ResponseCache برای تنظیم هدرهای response caching استفاده می کند. علاوه بر این، می‌توانیم از میان ‌افزار Response Caching برای کنترل رفتار ذخیره‌سازی سمت سرور استفاده کنیم. هنگامی که هدرهای response caching را تنظیم می‌کنیم، کلاینت‌ها و سایر پراکسی‌ها می‌توانند آن‌ها را بخوانند تا نحوه response caching از سرور را تعیین کنند. طبق مشخصات کش پاسخ HTTP 1.1، مرورگرها، کلاینت ها و پراکسی ها باید با هدرهای ذخیره سازی مطابقت داشته باشند.

می توانید ویدیو بررسی و پیاده سازی Response Caching در ASP.NET Core 8 را در یوتیوب کدسل مشاهده کنید.

Response Caching مبتنی بر HTTP

در Asp.net core می توانیم بر اساس HTTP Cache Directive های مختلف، رفتار کش را کنترل کنیم.

Cache-Control فیلد هدر اولیه است که ما از آن برای مشخص کردن روش کش کردن پاسخ استفاده می کنیم. هنگامی که هدر cache-control در پاسخ وجود دارد، مرورگرها، کلاینت ها و سرورهای پراکسی باید هدرها را رعایت کرده و با آنها مطابقت داشته باشند.

Directive های رایج Cache-Control

Public: نشان می دهد که یک کش می تواند پاسخ را در سمت کلاینت یا در یک مکان مشترک ذخیره کند.

Private: نشان می دهد که فقط یک کش خصوصی در سمت کلاینت ممکن است پاسخ را ذخیره کند، اما یک حافظه کش مشترک وجود ندارد.

no-cache:  مشخص می کند که کش نباید از یک پاسخ ذخیره شده برای هیچ درخواستی استفاده کند.

no-store:  نشان می دهد که کش نباید پاسخ را ذخیره کند.

no-cache وno-store ممکن است شبیه به هم به نظر برسند و حتی رفتار مشابهی داشته باشند، اما در نحوه درک مرورگرها یا کلاینت ها تفاوت‌هایی وجود دارد.

به غیر از  Cache-Control، چند هدر دیگر وجود دارد که می تواند رفتار کش را کنترل کند:

هدر pragma برای سازگاری با مشخصات HTTP 1.0 و دستورالعمل بدون کش است. اگر هدر cache-control را مشخص کنیم، هدر پراگما را نادیده می گیرد.

Vary - نشان می دهد که تنها در صورتی می تواند یک پاسخ کش شده را ارسال کند که تمام فیلدهایی که در هدر ارائه می کنیم دقیقاً با درخواست قبلی مطابقت داشته باشند. اگر هر یک از فیلدها تغییر کند، سرور یک پاسخ جدید ایجاد می کند.

مثال HTTP Cache Directive در Asp.net core

اکنون می‌خواهیم یک برنامه ASP.NET Core ایجاد کنیم و cache directive ها را در عمل ببینیم. بیایید یک پروژه ASP.NET Core Web API ایجاد کنیم و یک controller action method اضافه کنیم:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]        
    public IActionResult Get()
    {
        return Ok($"Response was generated at {DateTime.Now}");
    }
}

هر بار که این endpoint را اجرا می کنیم، می توانیم مشاهده کنیم که تاریخ و زمان واقعی اجرا را به پاسخ اضافه می کند. اکنون می‌خواهیم  کش را به emdpoint اضافه کنیم.

نکته مهم: در حین تست کش، همیشه باید روی لینک های صفحه وب کلیک کنیم یا از Swagger برای اجرای API endpoint ها در مرورگر استفاده کنیم. در غیر این صورت، اگر سعی کنیم صفحه را رفرش کنیم یا دوباره URI را فراخوانی کنیم، مرورگر همیشه بدون توجه به تنظیمات response cache ، از سرور درخواست پاسخ جدیدی می کند.

ویژگی(Attribute) ResponseCache در Asp.net core

برای یک برنامه ASP.NET Core، ویژگی ResponseCache ویژگی هایی را برای تنظیم هدرهای response caching تعریف می کند. ما می‌توانیم این ویژگی را در سطح Controller یا برای endpoint جداگانه اعمال کنیم.

بیایید ویژگی ResponseCache را به API endpoint اضافه کنیم:

 [ResponseCache(Duration = 120, Location = ResponseCacheLocation.Any)]
public IActionResult Get()
{
    return Ok($"Response was generated at {DateTime.Now}");
}

این ویژگی Duration هدر max-age را تولید می‌کند که از آن برای تنظیم مدت زمان کش برای 2 دقیقه (120 ثانیه) استفاده می‌کنیم. به طور مشابه، ویژگی Location مکان را در هدر cache-control تنظیم می کند. از آنجایی که ما مکان را به صورت Any تنظیم می کنیم، هم کلاینت و هم سرور می توانند پاسخ را در کش ذخیره کنند، که معادل دستور public هدر cache-control است.

بنابراین ، بیایید از API endpoint استفاده کنیم و این موارد را در هدرهای پاسخ ببنیم:

cache-control: public,max-age=120

علاوه بر این، هنگامی که چندین بار endpint را فراخوانی می کنیم، هر زمان که مرورگر از یک پاسخ  کش  شده استفاده می کند، در کد وضعیت نشان می دهد که پاسخ از disk cache گرفته شده است:

Status Code: 200 (from disk cache)

اکنون بیایید گزینه های مختلف برای پارامترهای ResponseCache را بررسی کنیم.

برای تغییر مکان کش به private، فقط باید مقدار ویژگی Location را به ResponseCacheLocation.Client تغییر دهیم:

[ResponseCache(Duration = 120, Location = ResponseCacheLocation.Client)]

این مقدار هدر cache-control را به private  تغییر می‌دهد، به این معنی که فقط کلاینت می‌تواند پاسخ را کش کند:

cache-control: private,max-age=120

اکنون بیایید پارامتر Location را به Responsecachelocation.none بروز کنیم:

[ResponseCache(Duration = 120, Location = ResponseCacheLocation.None)]

با این کار هدر cache-control و pragma روی no-cache تنظیم می‌شود، به این معنی که کلاینت نمی‌تواند از یک پاسخ کش شده بدون تأیید مجدد با سرور استفاده کند:

cache-control: no-cache,max-age=120

در این پیکربندی، می‌توانیم بررسی کنیم که مرورگر از پاسخ کش شده استفاده نمی‌کند و سرور هر بار یک پاسخ جدید تولید می‌کند.

پراپرتی  NoStore

اکنون بیایید پراپرتی NoStore در اتربیوت [ResponseCache] را تنظیم کنیم:

[ResponseCache(Duration = 120, Location = ResponseCacheLocation.Any, NoStore = true)]

این هدر پاسخ cache-control را روی no-store تنظیم می کند که نشان می دهد کلاینت نباید پاسخ را کش کند:

cache-control: no-store

توجه داشته باشید که این مقداری را که برای Location تنظیم کرده‌ایم لغو می‌کند. در این مورد نیز، کلاینت پاسخ را کش نخواهد کرد.

حتی اگر مقادیر no-cache و no-store برای cache-control ممکن است نتایج یکسانی را در حین تست ارائه دهند، مرورگرها، کلاینت ها و پراکسی ها این هدرها را متفاوت تفسیر می کنند. در حالی که no-store نشان می‌دهد که کلاینت‌ها یا پراکسی‌ها نباید پاسخ یا بخشی از آن را در جایی ذخیره کنند، no-cache فقط به این معنی است که کلاینت نباید از پاسخ کش شده بدون تأیید مجدد با سرور استفاده کند.

پراپرتی VaryByHeader

برای تنظیم هدر vary، می‌توانیم از ویژگی VaryByHeader در اتربیوت ResponseCache استفاده کنیم:

[ResponseCache(Duration = 120, Location = ResponseCacheLocation.Any, VaryByHeader = "User-Agent")]

در اینجا مقدار خاصیت VaryByHeader را روی User-Agent قرار می دهیم که تا زمانی که درخواست از همان دستگاه کلاینت ارسال شود، از پاسخ کش شده استفاده می کند. هنگامی که دستگاه کلاینت تغییر می کند، مقدار User-Agent متفاوت خواهد بود و پاسخ جدیدی از سرور دریافت می کند.

پراپرتی VaryByQueryKeys

با استفاده از ویژگی VaryByQueryKeys در اتربیوت ResponseCache، می‌توانیم کاری کنیم که سرور در هنگام تغییر پارامترهای رشته کوئری مشخص شده، پاسخ جدیدی ارسال کند. البته، با تعیین مقدار "*"، می‌توانیم در صورت تغییر هر یک از پارامترهای رشته کوئری، پاسخ جدیدی تولید کنیم.

[HttpGet]
[ResponseCache(Duration = 120, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new string[] { "id" })]
public IActionResult Get(int id)
{
    return Ok($"Response was generated for Id:{id} at {DateTime.Now}");
}

به یاد داشته باشید که برای تنظیم ویژگی VaryByQueryKeys باید میان افزار Response Caching را فعال کنیم. در غیر این صورت، کد یک runtime exception ایجاد می کند.

میان‌افزار Response Caching

میان‌افزار Response Caching در برنامه ASP.NET Core تعیین می‌کند که چه زمانی می‌توان یک پاسخ را در کش ذخیره کرد و پاسخ را از حافظه کش ارائه می‌کند.

برای فعال کردن Response Caching Middleware، فقط باید چند خط کد را در کلاس Program اضافه کنیم:

builder.Services.AddControllers();
builder.Services.AddResponseCaching();
...
var app = builder.Build();
...
app.MapControllers();
app.UseResponseCaching();

app.Run();

ابتدا باید سرویس  ()AddResponseCaching را به کانتینر پروژه اضافه کنیم و سپس می توانیم برنامه را برای استفاده از میان افزار با متد UseResponseCaching () پیکربندی کنیم.

اکنون میان‌افزار Response Caching را فعال کرده‌ایم و ویژگی VaryByQueryKeys باید کار کند.

بیایید برنامه را اجرا کنیم و به /values?id=1 برویم:

Response was generated for Id:1 at 23-05-2023 12:07:22

می بینیم که تا زمانی که رشته query یکسان باشد، یک پاسخ کش شده دریافت می کنیم، اما زمانی که رشته query را تغییر دهیم، سرور پاسخ جدیدی ارسال می کند.

بیایید رشته query را به /values?id=2 تغییر دهیم:

Response was generated for Id:2 at 23-05-2023 12:07:32

توجه داشته باشید که هیچ هدر HTTP متناظری برای ویژگی VaryByQueryKeys وجود ندارد. این ویژگی یک ویژگی HTTP است که توسط Response Caching Middleware مدیریت می شود.

Cache Profile ها در asp.net core

به جای کپی کردن تنظیمات response cache  در کنترلر ها یا اکشن ها ، می توانیم پروفایل های کش را پیکربندی کرده و از آنها استفاده مجدد کنیم. هنگامی که یک نمایه کش را تنظیم می کنیم، برنامه می تواند از مقادیر آن به عنوان پیش فرض برای ویژگی ResponseCache استفاده کند. البته، می‌توانیم پیش‌فرض‌ها را با مشخص کردن پراپرتی ها در اتربیوت [ResponseCache] لغو کنیم.

ما می توانیم یک نمایه کش در کلاس Program تعریف کنیم:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.CacheProfiles.Add("Cache2Mins",
        new CacheProfile()
        {
            Duration = 120,
            Location =  ResponseCacheLocation.Any            
        });
});
...

در اینجا یک نمایه کش جدید به نام Cache2Mins با مدت زمان 2 دقیقه و Location به عنوان public  تعریف می کنیم.

اکنون می توانیم این نمایه کش را روی هر کنترلر یا action اعمال کنیم:

[HttpGet]
[ResponseCache(CacheProfileName = "Cache2Mins")]
public IActionResult Get()
{
    return Ok($"Response was generated at {DateTime.Now}");
}

با این کار تنظیمات cache-control تعریف شده برای پاسخ اعمال می شود:

cache-control: public,max-age=120

به جای هارد کد کردن تنظیمات کش در کلاس Program، می‌توانیم چندین نمایه کش را در فایل appsettings برنامه تعریف کنیم و تنظیمات response cache را قابل تنظیم کنیم:

 {
  "Logging": {
...
  },
  "CacheProfiles": {
    "Cache2Mins": {
      "Duration": 120,
      "Location": "Any"
    }
  },
  "AllowedHosts": "*"
}

سپس، می‌توانیم پروفایل‌های کش در کلاس Program را با استفاده از کلاس ConfigurationManager بخوانیم:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    var cacheProfiles = builder.Configuration
            .GetSection("CacheProfiles")
            .GetChildren();

    foreach (var cacheProfile in cacheProfiles)
    {
        options.CacheProfiles
        .Add(cacheProfile.Key, 
        cacheProfile.Get<CacheProfile>());
    }
});

این روش بسیار بهتری برای تعریف نمایه های کش است، به خصوص زمانی که نیاز به تعریف چندین نمایه کش برای برنامه خود داشته باشیم.

نتیجه گیری

در این مقاله به موضوع response caching و نحوه استفاده از آن در asp.net core پرداختیم. علاوه بر این، ما یاد گرفته‌ایم که چگونه رفتار response caching را با تنظیم cache directive ها و استفاده از response caching middleware کنترل کنیم. در نهایت، نحوه تعریف نمایه کش و استفاده مجدد از آن در برنامه را یاد گرفتیم.

دیگر مقالات آموزش برنامه نویسی مدرس

Output Caching در ASP.NET Core 8.0

Output Caching یک ویژگی جدید است که از زمان .NET 7 معرفی شده است. این ویژگی به ما این امکان را می دهد که به راحتی یک کش پاسخ برای Web API خود بدون پیاده سازی IMemoryCache راه اندازی کنیم.

723 0 1402/10/14

الگوی طراحی زنجیره مسئولیت در سی شارپ

الگوی زنجیره مسئولیت یا Chain of Responsibility Design Pattern یک الگوی طراحی رفتاری(behavioral design pattern) است که اجازه می‌دهد یک درخواست در امتداد زنجیره‌ای از کنترل‌کننده‌های بالقوه ارسال شود تا زمانی که درخواست مناسب برای پردازش آن را پیدا کند.

685 2 1402/10/01

ViewComponent در ASP.NET Core

در ASP.NET Core با استفاده از ViewComponent ها می توان اجزای ماژولار، قابل استفاده مجدد، قابل نگهداری و مقیاس پذیر برای ساخت برنامه های کاربردی وب ایجاد کرد. در این مقاله به نحوه ایجاد و فراخوانی ViewComponent در Asp.net core پرداخته ایم.

1٬431 2 1402/05/15

تطبیق الگو در NET 7: ساده سازی تجزیه و تحلیل داده ها

تطبیق الگو یا Pattern Matching در net7 یک تکنیک قدرتمند برای تجزیه و تحلیل و دستکاری داده ها بر اساس ساختار آن ها است. تطبیق الگو یا Pattern Matching به توسعه دهندگان اجازه می دهد تا مقادیر را با یک الگوی خاص مطابقت دهند و اقدامات مربوطه را انجام دهند.

880 1 1402/04/05

تزریق وابستگی در ASP.NET Core

تزریق وابستگی (DI) یک الگوی طراحی نرم افزاری است که امکان ایجاد برنامه های کاربردی و ماژولار را فراهم می کند.. در .NET Core تزریق وابستگی یا Dependency injection یک ویژگی مهم است که می تواند برای ساده سازی توسعه برنامه، بهبود تست پذیری و کاهش پیچیدگی کد مورد استفاده قرار گیرد.

1٬964 1 1402/02/04

ضروری ترین کتابخانه های NuGet برای ASP.NET Core

در این مقاله مهمترین،ضروری ترین و پرکاربردترین کتابخانه های NuGet که هر توسعه‌ دهنده‌ ASP.NET Core باید برای توسعه بهتر و کاهش زمان مورد نیاز برای برنامه ‌های خود از آن استفاده کنند را مورد بررسی قرار داده ایم.

1٬517 1 1401/12/29

الگوی طراحی Factory در سی شارپ

الگوهای طراحی یکی از مهمترین جنبه های طراحی و معماری نرم افزار است. Factory Method یک الگوی طراحی ایجادی است که یک رابط برای ایجاد اشیاء در یک سوپر کلاس فراهم می‌کند. ما در این مقاله الگوی Factory Method Design در سی شارپ را بررسی می کنیم.

1٬642 1 1401/10/28

مقایسه List و Array در سی شارپ

آرایه و لیست در سی شارپ هر دو به عنوان مجموعه ای از مقادیر عمل می کنند، اما در نحوه ذخیره محتوای خود در حافظه و نحوه دسترسی به آنها متفاوت هستند. در این مقاله Benchmark و کارایی List<T> با سایز داینامیک، List<T> با سایز ثابت و Array ها را بررسی می کنیم.

2٬221 2 1401/09/01

LinkedList در سی شارپ

LinkedList یا لیست پیوندی در سی شارپ یک ساختار داده خطی است که عنصر را در مکان غیر پیوسته ذخیره می کند. LinkedList شامل گره هایی است که هر گره حاوی یک فیلد داده و یک مرجع (پیوند) به گره بعدی در لیست است. در سی شارپ، LinkedList یا لیست پیوندی یک نوع مجموعه جنریک است.

2٬046 0 1401/08/13

Garbage Collection در دات نت

به طور کلی، Garbage Collection (GC) یا جمع آوری زباله در .Net چیزی نیست جز به دست آوردن مجدد حافظه اختصاص داده شده به اشیایی که در حال حاضر در هیچ بخشی از برنامه ما استفاده نمی شوند. ما در این مقاله Garbage Collection را در سی شارپ بررسی خواهیم کرد.

2٬838 5 1401/03/30

.NET Core چیست؟

.Net (با تلفظ «دات نت») یک چارچوب نرم افزاری کامپیوتری مدیریت شده رایگان و منبع باز برای سیستم عامل های ویندوز، لینوکس و macOS است. این پروژه در درجه اول توسط کارمندان مایکروسافت از طریق دات نت توسعه یافته و تحت مجوز MIT منتشر شده است.

2٬587 2 1401/03/16

پشته(Stack) در سی شارپ

پشته یا Stack در سی شارپ یک نوع خطی از ساختار داده است که قادر به ذخیره اشیاء است. پشته یک ساختار داده LIFO یا Last-In-First-Out است، به این معنی که آخرین موردی که در پشته قرار می گیرد اولین موردی است که از پشته خارج می شود.

2٬187 0 1401/03/09

صف (Queue) در سی شارپ

صف (Queue) در سی شارپ یک نوع خطی از ساختار داده است که قادر به ذخیره اشیاء است. Queue یک ساختار داده first-in-first-out یا FIFO است که به این معنی است که اولین مورد اضافه شده به صف اولین موردی است که حذف می شود.

2٬162 0 1401/02/30

تفاوت Hashtable و Dictionary در سی شارپ

در سی شارپ از Hashtable و Dictionary می توان برای ذخیره مجموعه‌ای از داده‌ها، شبیه به List معمولی استفاده کرد. با این تفاوت که Hashtable و Dictionary عناصر را به عنوان جفت Key/Value ذخیره می کنند.در این مقاله به تفاوت های Hashtable و Dictionary پرداخته شده است.

1٬843 1 1401/02/23

Dictionary در سی شارپ

در سی شارپ از دیکشنری ها (Dictionary) می‌توان برای ذخیره مجموعه‌ای از داده‌ها، شبیه به List معمولی استفاده کرد. تفاوت اصلی این است که یک Dictionary می تواند عناصر را به عنوان جفت Key/Value ذخیره کند.Key ها باید منحصر به فرد و نمی توانند null باشند. Value ها می توانند تکراری یا null باشند.

2٬249 3 1401/02/17

Hashtable در سی شارپ

از Hashtable می‌توان برای ذخیره مجموعه‌ای از داده‌ها، شبیه به List معمولی استفاده کرد. تفاوت اصلی این است که یک Hashtable می تواند عناصر را به عنوان جفت Key/Value به عنوان جایگزینی برای استفاده از Index ذخیره کند.

1٬721 5 1401/02/14

Redirect درخواست (ریدایرکت) در asp.net core

در برنامه های ASP.NET Core برای تغییر مسیر(ریدایرکت) و Redirect به یک URL خاص روش های مختلفی وجود دارد. در این مقاله با این تکنیک ها و کدهای مورد نیاز برای تغییر مسیر یک درخواست در ASP.NET Core آشنا می شویم.

2٬562 5 1401/02/12

تبدیل enum به لیست انتخابی در asp.net core

در این آموزش ما بوسیله Reflection ها در سی شارپ و asp.net core یک enum را به لیست انتخابی یا SelectListItem تبدیل خواهیم کرد و بوسیله تگ select در بوت استرپ 5 نمایش می دهیم.

1٬753 3 1401/02/03

نحوه ارسال ایمیل در asp و c#

امروزه ارسال ایمیل به امری ضروری در پروژه های وب تبدیل شده است.از ارسال ایمیل در asp می توان در بخش های تایید حساب کاربری،بازیابی رمز عبور،ایمیل مارکتینگ،ارسال خبرنامه و ... استفاده نمود.در این آموزش نحوه ارسال ایمیل در asp core و سی شارپ پیاده سازی گردیده است.

2٬582 5 1401/02/03
نظرات

برای ثبت نظر باید در سایت ثبت نام یا ورود نمایید