PDA

View Full Version : کش کردن یوزرکنترل



iekrang
یک شنبه 19 شهریور 1385, 15:25 عصر
سلام.
من میخواهم از کش استفاده کنم چند تا سوال داشتم در این مورد:
صفحه ای دارم شامل تعدادی یوزرکنترل.چطور میتونم کل اون یوزرکنترل ها رو کش کنم؟آیا میشه یوزرکنترل رو هم کش کرد؟
ممنون میشم اگر یه توضیح کلی در این مورد به من بدید که چه چیزهایی رو میشه کش کرد. چون من فقط با کش کردن دیتاست آشنا هستم.

Behrouz_Rad
یک شنبه 19 شهریور 1385, 17:22 عصر
می تونی در فایل ascx هر User Control یک دایرکتیو OutputCache برای اون تعریف کنی اما باید به یک نکته ی مهم توجه داشته باشی.
اگر User Control و صفحه ای که این User Control در اون قرار میگیره هر دو دارای دایرکتیو OutputCache باشند و زمان تعیین شده برای کش صفحه از زمان کش User Control بیشتر باشه، زمان کش صفحه ارجحیت بیشتری نسبت به زمان کش User Control خواهد داشت. به عبارت دیگه، تعیین زمان کش برای User Control در حالت فوق، تاثیری در کش User Control نخواهد داشت!
اما در صورتی که عکس گفته ی فوق صادق باشه، User Control و صفحه به صورت مجزا و معمول کش خواهند شد.

امکانات وسیعی برای مانور دادن در تکنیک Caching در ASP.NET وجود داره.
به عنوان نمونه ای دیگه، خاصیت "VaryByControl" دایرکتیو OutputCache، برای هر جز از User Control یک نسخه ی کش متفاوت ایجاد می کنه.
فرض کن TextBox ای در User Control ات با نام "myTextBox" ایجاد کردی. اگر خاصیت "VaryByControl" دایرکتیو OutputCache رو برابر با "myTextBox" قرار بدی، به ازای هر مقدار وارده در Text Box، یک نسخه ی مختلف از صفحه Cache خواهد شد.

این امکانات رو در کلاس PartialCachingAttribute میتونی پیدا کنی.

و کلام آخر اینکه تقریبا هر چیزی رو میتونی در Cache نگهداری کنی.

موفق باشی.

hamed_bostan
یک شنبه 23 اردیبهشت 1386, 11:11 صبح
با سلام خدمت استاد خودم اقا بهروز .
ممنون از پاسخ کاملت اما ببینم بعد از این که این کار رو انجام دادیم و داخل مستر پیج این دایرکتور رو قرار دادیم داخل فایل ascx هم این دایرکتور رو گذاشتیم (من می خوام یه UC که داخل مسترپیجم هست cache بشه) بعد از انجام این کارها ایا دیگخ کد نویسی خواصی هم داره؟ میشه کدش رو واسه ام بذاری؟
من یه UC دارم که یه treeview داخلش هست . چی کار کنم که بار اول که رفت خوند دیگه نره این Treeview پر شه و دیگه تو تمام صهحات یکسان باشه؟
ممنون

hamed_bostan
یک شنبه 23 اردیبهشت 1386, 11:56 صبح
من یه usercontrol دارم توی مستر پیجم که توی همه صفحات ثابت هستش . داخل اون یه datagrid و یه Treeview هستش . منظورم اینه گه چطور می تونم این User control رو cache کنم و توی تمام صفحات از cache بخوندشون و دیگه نره از دیتا بیس بخونتشون ؟؟؟
کدش به چه شکله که من یه user control رو cache کنم؟؟؟

Behrouz_Rad
یک شنبه 23 اردیبهشت 1386, 23:32 عصر
فکر می کنم در پست قبلی به سوالات اخیرت پاسخ دادم!
تنها کار مورد نیاز، تنظیم دایرکتیو OutputCache است.

موفق باشید.

hamed_bostan
دوشنبه 24 اردیبهشت 1386, 00:20 صبح
بهروز جان میشه واضح تر توضیح بدی؟
دایرکتور رو فقط تنظیم کنم؟
کد نمی خواد؟
میشه این یکی رو واسه خاطر منم شده کامل با کد تویح بدی؟
ممنون میشم
من از cache هیچ چی نمی دونم
ضمنا این دایرکتور outputcache در مستر پیج فعال نیست!!!

Behrouz_Rad
دوشنبه 24 اردیبهشت 1386, 02:22 صبح
بهروز جان میشه واضح تر توضیح بدی؟
توضیح در مورد چی؟

دایرکتور رو فقط تنظیم کنم؟
بله.

میشه این یکی رو واسه خاطر منم شده کامل با کد تویح بدی؟
دایرکتیو OutputCache رو به چیزی همانند زیر تنظیم کن:


<%@ OutputCache VaryByParam="none" Duration="10" %>

کد فوق، صفحه رو به مدت 10 ثانیه در Cache نگهداری می کنه.

من از cache هیچ چی نمی دونم
www.google.com

ضمنا این دایرکتور outputcache در مستر پیج فعال نیست!!!
نباید هم باشه!
MasterPage یک نوع Container هست که Cache عمومی رو پذیرا نیست.
به نظر این رفتار صحیح به نظر میرسه چون معنا نداره که Cache رو برای Master Page تعریف کنی.
Cache رو برای هر صفحه که قصد داری در Cache ذخیره بشه باید تعریف کنی.
صفحات Content و UC ها تنها این دایرکتیو رو دارند.

موفق باشید.

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

hamed_bostan
دوشنبه 24 اردیبهشت 1386, 09:08 صبح
اولا : که خیلی ممنون
دوما : ایا وقتی صفحه ای برای مدت10 دقیقه در cache دخیره میشه کاربران دیگه هم که اطن صفحه رو درخواست می کنن واسه شون از حافظه میاره صفحه رو یا نه برای اونها هم بار اول لود می کنه و از اون به بعد از حافظه میاره یعنی در اصل می خوام بدونم به ازای هر کاربر یه نسخه از این صفحه تو حافظه می مونه یا نه فقط همون یه دونه هست .

سوما : ایا اگر مدت زمان ذخیره صفحه 10 دقیقه باشه ایا این expire شدن صفحه 10 دقیقه بعد از اخرین در خواسته و یا نه کلا 10 دقیقه می مونه و والسلام

چهارما: اگر صفحه در طول این 10 دقیقه اطلاعاتش update شد من از کجا باید بفهمم و صفجه رو توی حافظه دخیره شده update کنم؟ آیا خود سیستم وقتی صفحه update شده اطن کار رو می کنه؟ یا باید کد خاصی بنویسم؟



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


به خدا تقریبا تمام پست های در رابطه با cache رو جستجو کردم و دطدم و خیلی چیزها هم دستم اومده اما هنوز بنیادی مشکل دارم واگرنه الان ببت کش کردن متن یا یه آیتم خاص راه افتادم

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

Behrouz_Rad
دوشنبه 24 اردیبهشت 1386, 10:44 صبح
دوما : ایا وقتی صفحه ای برای مدت10 دقیقه در cache دخیره میشه کاربران دیگه هم که اطن صفحه رو درخواست می کنن واسه شون از حافظه میاره صفحه رو یا نه برای اونها هم بار اول لود می کنه و از اون به بعد از حافظه میاره یعنی در اصل می خوام بدونم به ازای هر کاربر یه نسخه از این صفحه تو حافظه می مونه یا نه فقط همون یه دونه هست .
تنها برای بار اول درخواست، صفحه Cache میشه و برای درخواست های بعدی از حافظه فراخوانی میشه. (البته این حالت به دلیل پیش فرض بودن مقدار Any برای خاصیت Location هست)

سوما : ایا اگر مدت زمان ذخیره صفحه 10 دقیقه باشه ایا این expire شدن صفحه 10 دقیقه بعد از اخرین در خواسته و یا نه کلا 10 دقیقه می مونه و والسلام

چهارما: اگر صفحه در طول این 10 دقیقه اطلاعاتش update شد من از کجا باید بفهمم و صفجه رو توی حافظه دخیره شده update کنم؟ آیا خود سیستم وقتی صفحه update شده اطن کار رو می کنه؟ یا باید کد خاصی بنویسم؟
کش صفحات به طور پیش فرض، Absolute هست. بدین معنا که تا میزان زمان مشخصی که برای کش در OutptCache مشخص می کنی، صفحه در کش باقی می مونه.

در ASP.NET 1.x، در صورتی که قسمت هایی از صفحه وجود داشتند که در زمان کش صفحه آپدیت میشدند، از Fragment Caching استفاده میشد.

در ASP.NET 2.0، می تونی:
1) از متد WriteSubstitution کلاس Response استفاده کنی.
2) از کنترل Substitution استفاده کنی.
3) اگر قسمت های پویا مربوط به داده های دیتابیس هستند از SQL Cache Notification استفاده کنی.

همچنین برای اینکه نوع زمان Caching رو به Sliding تغییر بدی، به شکل زیر عمل کن:


Response.Cache.SetSlidingExpiration(true);


موفق باشید.

hamed_bostan
دوشنبه 24 اردیبهشت 1386, 12:46 عصر
واقعا ممنون
اما 3 سوال دیگه

اول: ایا کاربر وقتی داره صفحه ای رو مشاهده می کنه ctrl+f5 رو بزنه باز هم از cache واسه اش میاره یا نه ایندفعه صفحه refresh میشه و از db می خونه

دوم: sliding یعنی چی؟ یعنی از اخرین درخواست به بعد؟ این خصوصیت رو که true می منیم چی میشه؟

سوم: ایا مقاله ای راهنمیی چیزی در رابطه با sql cache notification سراغ دارین؟


بهروز جان از پاسخ های راهگشات خیلی خیلی ممنون

Behrouz_Rad
دوشنبه 24 اردیبهشت 1386, 14:54 عصر
اول: ایا کاربر وقتی داره صفحه ای رو مشاهده می کنه ctrl+f5 رو بزنه باز هم از cache واسه اش میاره یا نه ایندفعه صفحه refresh میشه و از db می خونه
F5 یا Ctrl + F5 یک بحث Client Side هست و ارتباطی با Caching صفحات بر روی سرور نداره.

دوم: sliding یعنی چی؟ یعنی از اخرین درخواست به بعد؟
بله.

سوم: ایا مقاله ای راهنمیی چیزی در رابطه با sql cache notification سراغ دارین؟
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/caching/SQLInvalidation.aspx

این رو هم برای درک مفاهیم کش بخون:
http://www.15seconds.com/Issue/060330.htm

موفق باشید.

majid_afra222
دوشنبه 24 اردیبهشت 1386, 16:02 عصر
سلام
بد نیست به مقالات سایت سخاروش یه سری بزنی.
www.srco.ir

hamed_bostan
دوشنبه 24 اردیبهشت 1386, 17:03 عصر
خوب همه این ها درست . ممنون از راهنمایی ها . فقط یه مشکل دیگه وجود داره .
من یه مستر پیج دارم که در کنار اون یه webusercontrol دارم که توش یه سری اطلاعاته و از db خونده میشه . اومدم داخل اون user control کش کردن رو واسه 100 تانیه فعال کردم اما مشکل اینجاست که وقتی بین صفحات حرکت می کنم و یا حتی همون صفحه رو که refresh می کنم باز میره از db می خونه در صورتی که وقتی از Masterpage استفاده نکنم و صفحه عادی باشه درسا جواب میده. فکر میکنین مشکل از کجاست؟؟؟