Cache کردن HTTP Handlers

جمعه 4 تیر 1395

این مقاله به شما نحوه ی Cache کردن Http handlerهارا به شما یاد می دهد. handler، یک مقدار استاتیک و در موارد بسیار کمی مقدار تغییر پذیر برمیگرداند که برنامه نویسان باید عملیات Caching را روی آن انجام دهند

Cache کردن HTTP Handlers

زندگی یک برنامه نویس ASP.Net زمانی فرا می رسد که باید HTTP handler خودش را بنویسد.

اغلب اوقات ، handler، یک مقدار استاتیک و در موارد بسیار کمی مقدار تغییر پذیر برمیگرداند که برنامه نویسان باید عملیات Caching را روی آن انجام دهند .

مرحله1.مشخص کردن مدت زمانی که داده ها باید در Cache نگهداری شوند.

بعضی از افراد از این طریق انجام می دهند

context.Response.Cache.SetExpires(DateTime.Now.AddDay(1));

بعضی از افراد هم  این روش را دوست دارند:

context.Response.Cache.SetMaxAge(86400); //1 day in seconds 

بیشتر برنامه نویس های دقیق از هردو استفاده می کنند:

context.Response.Cache.SetExpires(DateTime.Now.AddDay(1));
  context.Response.Cache.SetMaxAge(86400);

همه ی موارد بالا به روش خودشان ، درست می باشند.در مثال اول ، روز دقیق تاریخ انقضا را تنظیم کرده است.در لیستی از header ها مثال اول به شکل زیر می شود.

Expires: Mon, 25 Jul 2016 19:50:09 GMT

این header در HTTP/1.0 مشخصی ، معرفی شده است.اما با HTTP/1.1 هم حمایت می شود.یک خطر کوچک دیگری وجود دارد که مربوط به header می شود که تاریخ و زمان تنظیم شده ، منقضی شده باشد.این امر زمانی موجب مشکل می شود که زمان سرور و proxy برنامه، از یکدیگر  متفاوت باشد.

به منظور حل مشکل بالا یک header جدید در  HTTP/1.1: max-age معرفی شده است.که زمان انقضا را به نسبت زمان پاسخ  مشخص می کند به عنوان مثال یک بازه ی زمانی در ثانیه ، که بعد از گذشت از این بازه ، داده های Cache شده کهنه در نظر گرفته می شوند(منقضی).

Cache-Control: max-age=86400

در این حالت  هر دو headerها ، به صورت max-age ی که  دارای اولویت هستند، تنظیم شده‎اند .حتی اگر مقدار Expires محدودتر باشد.

در این مرحله بسیاری از برنامه نویسان در نظر دارند که کار خود را انجام دهند و  بعد به سراغ کارهای دیگر بروند.

مرحله2.مشخص کردن این که محتوای Cache کجا ذخیره شود.

اجازه دهید تا  HTTP trafic analyser (به عنوان مثال FireBug )را ، اجرا کنیم و بررسی کنیم که منابع Cache شده  چگونه بارگذاری می شوند.در اغلب موارد، ما متوجه می شویم  منابعی که وضعیت آن ها   200(OK) می باشند در هر بار refresh کردن بارها  بدون remark  ، بارگذاری می شوند.به این header  توجه کنید.

Cache-Control: private, max-age=86400

Private به معنای داده هایی است که فقط می توانند توسط مرورگرها Cache شوند و در سرورها نمی توانند Cache شوند. با فرض این که مرورگر ها دارای cache محدودی می باشند(به عنوان مثال سایز پیش فرض  Cache مرورگر  Firefox ، 50 MB می باشد) مرورگری که شما استفاده می کنیدممکن است تصمیم بگیرد که اجازه دادن به یک وب سایت که فضای زیادی را اشغال کرده است ، بهترین ایده نمی باشد و به خاطر همین  داده های Cache شده را پاک می کند.

داده های Cache شده "user sensitive" نیستند آن ها زمانی حساس می شوند که آن ها را در سرور ذخیره کنیم.

context.Response.Cache.SetCacheability(HttpCacheability.Public);

در این مرحله بسیاری از برنامه نویسان در نظر دارند که کار خود را انجام دهند و  بعد به سراغ کارهای دیگر بروند.

مرحله3. مدیریت نوسازی داده های Cache شده

حال موارد زیر را در نظر بگیرید:

سرورهای پروکسی ، Overload شده  وبرخی اوقات  ورودی های  موجود Cache  را پاک میکند.

ورودی های Cache شده که  منقضی شده اند اما هنوز تغییر نکرده اند.

 

 به عنوان یک نتیجه ورودی ها Cache شده از  برنامه های سرور ، بازیابی خواهند شد که این کار ترافیک را زیاد و performance را کاهش خواهد داد.

یک روش مناسب ، جلوگیری از بارگذاری همه ی داده ها است بجز زمانی که بخواهیم یک پاسخ با وضعیت 304(بدون تغییر) برگردانیم.

برای  انجام این کار ، باید آخرین تغییر header را تنظیم کنید.

context.Response.Cache.SetLastModified(new DateTime(2016, 4, 1));

 

که خروجی زیر را می سازد:

Last Modified: Fri Apr 1 2016 00:00:00 GMT

یک سرور بررسی می کند که ورودی Cacheشده که منقضی شده است نیاز به کپی برداری مجدد دارد یا نه و سپس ، هدر     If-Modified-Since     ویرایش شده  را با زمان وتاریخ جاری می فرستد. ما می توانیم این مورد را بررسی کنیم و یک پاسخ 304 light-weight را ، به جای ارسال کل محتوا ، بازگردانیم .

var ifModifiedSinceHeader = context.Request.Headers["If-Modified-Since"];
if (!string.IsNullOrEmpty(ifModifiedSinceHeader))
{
    var ifModifiedSinceDate = DateTime.Parse(ifModifiedSinceHeader);
 
    if (/*cached data are not modified since this date*/)
    {
        context.Response.StatusCode = 304;
        context.Response.StatusDescription = "Not Modified";
        return;
    }
}
 
//otherwise return the normal response containing data and 
//do not forget about setting the Last Modified header...

درواقع رویکرد فوق یک روش  پایه است بسیاری از header های کاربردی که می توانند برای تنظیم عملیات Cache مورد استفاده قرار گیرند را توصیف نمی کند.به عنوان مثال ETag ،  must-revalidate و...

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید