PDA

View Full Version : مشکل در حذف رکورد در هنگام بسته شدن پنجره بدون logout



nazaninam
سه شنبه 14 شهریور 1385, 09:40 صبح
سلام من یک صفحه و فقط یک صفحه برای کاربران ساختم که توی اون صفحه ابتدا نام کاربریشون رو میزنن و یک تکس باکس براشون باز میشه و میتونن به ادمین سایت بصورت آنلاین پیام بدن و ادمین کسانی که وارد این صفحه شدن رو آنلاین میبینه و بقیه رو آفلان
در ضمن بگم تمام گفتگو ها در دیتابیس ثبت میشه چون همش باید ذخیره شه...
وقتی کاربر از صفحه logout میکنه فلگی داخل جدول مربوطه داخل دیتابیس false میشه
خوب فرض کردم که کاربر بدون logout پنجررو ببنده حالا دیگه فلگ false نمیشه و به همون صورت باقی میمونه و ادمین فکر میکنه که طرف هنوز آنلاینه باسه همین از cache بصورت زیر استفاده کردم و بعضی وقتا مخصوصا دفعه اول کار میکنه دفعه بعد که کاربران دیگه میان کار نمیکنه:
در هنگام لود صفحه ساب روتین زیر رو صدا کردم



Public Sub loadCaching()
Session("User") = user_id.Text
Session("Lastvisit") = DateTime.Now

در اینجا هم اطلاعات رو وارد db کردم

Dim CloseUser As System.Web.Caching.CacheItemRemovedCallback
CloseUser = AddressOf Pages_CloseUser
Cache.Add("UserOnlineList", Session("User").ToString, Nothing, DateTime.Now.AddMinutes(2), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, CloseUser)
End Sub



در سشن Session("User") نام کاربری طرف رو ذخیره کردم ...
و کد remove call back هم اینه :





Private Sub Pages_CloseUser(ByVal key As String, ByVal Value As Object, ByVal reason As CacheItemRemovedReason)
If key = "UserOnlineList" Then

If CType(Session("Lastvisit"), DateTime).Minute - minut < DateTime.Now.Minute - minut Then
Call delete_user()
End If


Dim CloseUser As System.Web.Caching.CacheItemRemovedCallback
CloseUser = AddressOf Pages_CloseUser
Cache.Add("UserOnlineList", Session("User").ToString, Nothing, DateTime.Now.AddMinutes(2), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, CloseUser)
End If
End Sub



من نمیدونم مشکل این کد کجاست میشه راهنماییم کنیم...

Behrouz_Rad
سه شنبه 14 شهریور 1385, 10:14 صبح
CacheItemRemovedCallback زمانی فراخوانی میشه که Cache منقضی بشه.
زمانی که Cache از بین رفت، مسلما دیگه Cache ای وجود نداره تا در مرتبه های بعدی باعث رخ دادن روال CacheItemRemovedCallback بشه!
راه حل این مشکل اینه که بلافاصله پس از از بین رفت Cache، آیتمی رو در Cache قرار بدید.
Cache از طریق HttpContext مورد دستیابی قرار میگیره. زمانی که CacheItemRemovedCallback اجرا میشه، HttpContext ای وجود نداره. چون روال مذبور در پشت صحنه اجرا میشه.
در نتیجه باید قبل از قرار دادن مجدد آیتم در Cache، یک درخواست مجازی به صفحه ای اجرا کنی و سپس آیتم رو در Cache قرار بدی.

موفق باشید.

nazaninam
سه شنبه 14 شهریور 1385, 11:16 صبح
ممنون آقای راد با راهنماییتون مشکلم حل شد ...