Cache کردن HTTP Handlers
جمعه 4 تیر 1395این مقاله به شما نحوه ی Cache کردن Http handlerهارا به شما یاد می دهد. handler، یک مقدار استاتیک و در موارد بسیار کمی مقدار تغییر پذیر برمیگرداند که برنامه نویسان باید عملیات Caching را روی آن انجام دهند
زندگی یک برنامه نویس 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 و...
- ASP.net
- 1k بازدید
- 2 تشکر