الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Logout In Asp.net

بدأه ya_as في 18 مارس 2008 · 18 رد · 1,691 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني معي برنامج على النت في موضوع انه لما المستخدم يدخل User,Password

بتاعه يتم تعديل حالة الدخول في قاعدة البيانات إنه OnLine

ألى هون ما فيش مشكله

المشكله : انه لما المستخدم يقوم بإغلاق الموقع بطريقه غير طبيعيه مثل ALT+F4

أو مثلا إنقطاع التيار ............إلخ

في هذه الحالة كيف أقدر أغير حالة الدخول إلى OffLine

مشكورين

#2

عملية حفظ حالة المستخدم تتم في الSession وليس قاعدة البيانات. وبما ان الSession تمحى بعد 20 دقيقه من اغلاق المستخدم للمتصفح فان المستخدم يصبح في حالة Offline.

اي نسخه منAsp.net تستعمل؟

#3

مشكور اخي على سرعة تجاوبك

بس انا اخزن حالة المستخدم في قاعدة البيانات علشان المسخدم ما يقدر يعمل login من جهاز آخر هو لسه Online

أرجوا اني اكون وصلت المشكله

#4

للأسف أخي الحبيب لا توجد طريقة صحيحة 100% لحل مشكلتك هذه التي قابلت الكثيرين ومنهم أنا ..

وذلك راجع للصعوبة الشديدة لتعقب إغلاق المتصفح ..

ولكني سمعت أن بإمكانك مع الـ AJAX فعل ذلك .. ولكني لا أدري هذه الطريقة ..

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#5

معقوله يعني ما حل

#6

اخي لماذا لاتستخدم Global.asax

<%@ Application Language="VB" %>

<script runat="server">

	Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs on application startup
	End Sub

	Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs on application shutdown
	End Sub

	Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs when an unhandled error occurs
	End Sub

	Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs when a new session is started
	End Sub

	Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs when a session ends. 
		' Note: The Session_End event is raised only when the sessionstate mode
		' is set to InProc in the Web.config file. If session mode is set to StateServer 
		' or SQLServer, the event is not raised.
	End Sub

</script>

عند حدث Session_End تستطيع ان تضع حالة الـمستخدم offline بالنسبة للداتا بيس

تم تعديل هذه المشاركة بواسطة محمد سماقية في 18 مارس 2008 في 16:48

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#7

المشكلة تكمن في أنك كيف تتعقب قيام المستخدم بغلق متصفحه ثم تغير الحالة على قاعدة بياناتك ؟؟؟

وصدقني أخي الحبيب لقد واجهتني هذه المشكلة واستغرقت مني وقت كثير لإيجاد حل صحيح .. ولم أجد في النهاية حلاً صحيحاً 100% .. وقمت لحل هذه المشكلة بتغيير الفكرة ..

بمعنى بدل من أن أمنع مستخدم حالته Online من الدخول وذلك لمنع أكثر من مستخدم من الدخول .. بدلاً من ذلك تعقبت SessionID الخاص به .. فإذا ثبت أنه نفس السابق أدخله ولا بأس .. ولو كان غيره فأدخل الجديد وأطرد الأول وهكذا ..

وصدقني لقد تعبت كثيراً لإيجاد حل صحيح وأفضل من ذلك .. ولذا لو عثرت على حل يا ريت تفيدنا به ..

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#8

وأخي محمد سماقية .. لو قام المستخدم بنفسه بعمل تسجيل خروج فلا بأس ولا توجد أي مشكلة .. ولكن ماذا لو يقم بذلك وفقط أغلق المتصفح .. هنا سيبقى السيشن مفتوح حتى 20 دقيقة إفتراضياً وستبقى حالته Online .. ولو أراد الدخول لن يستطيع .. فهنا المشكلة ..

وأكرر أنني سمعت أن لها حل بالأجاكس AJAX .. ولكني لم أقع عليه ..

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#9

اخي محمد سماقية

هل هذا حل حتى لو المستخدم اغلق الموقع من X في البروازر او انقطع التيار

واذا كان كذلك

هل اظيف الملف ده كامل والا اظيف الدوال الخاصه بالسيشن

ممكن تشرح اكثر

ربنا يفتح عليك من واسعه

#10

نعم اخي هذا حل ولكن ليس بنفس الوقت اي ليس بالوقت الذي سوف يغلق المستخدم الصفحة وهو متعلق بالـtime out للـsession اي عند انتهاء السيشن بالنسبة للسيرفر

كيفية اضافة Global.asax بالنقر باليمين على المشروع من نافذة soultion explorer ومن ثم اختار Add new Item ومن ثم اختار

global application class كما بالصورة

وبعد ذلك ومن نافذة soultion explorer افتح Global.asax وبداخله تجد حدث باسم

  Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
		' Code that runs when a session ends. 
		' Note: The Session_End event is raised only when the sessionstate mode
		' is set to InProc in the Web.config file. If session mode is set to StateServer 
		' or SQLServer, the event is not raised.
	End Sub

وضمن هذا الحدث ضع الكود الذي تريده مثلا تغير حالة المستخدم بالدتا بيس

post-127137-1205950161_thumb.jpg

تم تعديل هذه المشاركة بواسطة محمد سماقية في 19 مارس 2008 في 21:09

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#11

مشكور اخي

كيف اقدر استخدم الاتصال مع DB في Session_End

#12

http://www.daniweb.com/forums/thread93559.html

ولكن اخي انتبه الى هذه الملاحظات:

1. Session_End event is supported only in InProc mode. 
2. Session_End won't be fired if you close your browser. HTTP is a stateless protocol, and the server has no way to know if your browser has closed or not.
3. Session_End will be fired only (i) after n minutes of inactivity (n = timeout value), or (ii) if someone calls Session.Abandon().
4. For case (i) (pt. 3), Session_End will be run by a background thread, which implies:
a. Your code in Session_End is running using the worker process account. You may have permission problem if you're accessing resource such as database.
b. If an error happens in Session_End, it will fail silently.
5. For case (ii), please note that in order for Session_End to be fired, your session state has to exist first. That means you have to store some data in the session state and has completed at least one request. 
6. Again for case (ii), Session_End will be called only if the abandoned session is actually found. As a result, if you create and abandon a session inside the same request, because the session hasn't been saved and thus can't be found, Session_End won't be called. This is a bug in v1 and upcoming v1.1.

تم تعديل هذه المشاركة بواسطة محمد سماقية في 20 مارس 2008 في 09:40

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#13

إفتهلي من الرد بتاعك انه لازم أظيف Con في Global.asax

يعني ما اقدر استخدم الCon الي أستخدمه في بقية البرنامج

هل هذا صحيح

ام انه يعتبر ثغره لما تضيف Con في الملف المذكور

مشكور اخي

#14

اخي اين الثغرة !!!!!!

على كل حال مو مشكلة شاهد هذه المقالة

http://www.dotnetjunkies.com/Article/91EA6...0DEF7808A3.dcik

بدلاً من ملف global.asax تستطيع ان تعرف كلاس موروث من System.Web.HttpApplication وهكذا بكل سهولة تستطيع ان تستخدمه ضمن المشروع كأي كلاس آخر وايضاً تستطيع ان تطبق الوراثة الهرمية ......

تم تعديل هذه المشاركة بواسطة محمد سماقية في 20 مارس 2008 في 10:17

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#15

Why no comment

أنا ضفت Con في الملف Global.asax في قسم session_end

وعملت Update لحالة المستخدم =Offline عن طريف oledbconnection بشرط انه المستخدم = session("User") الي هو اخده لما اسوي login

وغيرت TimeOut في webconfig=1

ولما اغلق المتصفح او لا اعمل اي شي على الموقع انتظر اكثر من دقيقه

والمشكله انه حالة المستخدم تظل online

#16

المشكلة أخي أنا شرحتها أكثر .. الوقت الافتراضي 20 دقيقة .. تخيل معي لو قام مستخدم بغلق المتصفح .. وبعدها بخمس دقائق أراد الدخول .. هل سيتمكن من الدخول ؟؟؟ كلا لأن حدث Session_End لم يتم استدعاءه بعد لأنه يعمل افتراضياً بعد 20 ق ليس 5 ق .. وبهذا سيتضايق متصفح موقعك وهكذا ..

يمكنك مثلاً أن تقول أنك ستقلل الوقت الافتراضي ولكن هذا يقابله مشاكل أخرى ... متمثلة في طرد المستخدم من الموقع كل برهة ترك فيها موقعك بدون أي تفاعل ..

ولذلك أنا قلت وأكدت على مسؤوليتي وعلى نطاق البحث الكثير الذي عملته على النت .. ليس هناك حل صحيح 100%

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#17

المشكله انه عندي ما تتنفذ session_end

غير timeout دقيقه واحده بس مش راضيه تتنفذ

#18
moh_kin كتب:
المشكلة أخي أنا شرحتها أكثر .. الوقت الافتراضي 20 دقيقة .. تخيل معي لو قام مستخدم بغلق المتصفح .. وبعدها بخمس دقائق أراد الدخول .. هل سيتمكن من الدخول ؟؟؟ كلا لأن حدث Session_End لم يتم استدعاءه بعد لأنه يعمل افتراضياً بعد 20 ق ليس 5 ق .. وبهذا سيتضايق متصفح موقعك وهكذا ..

يمكنك مثلاً أن تقول أنك ستقلل الوقت الافتراضي ولكن هذا يقابله مشاكل أخرى ... متمثلة في طرد المستخدم من الموقع كل برهة ترك فيها موقعك بدون أي تفاعل ..

ولذلك أنا قلت وأكدت على مسؤوليتي وعلى نطاق البحث الكثير الذي عملته على النت .. ليس هناك حل صحيح 100%

اخي هناك فكرة

عند تسجيل الدخول نأخذ الـsession ID ونحفظه عند الـclient او العميل اي بالـcookie ولنفرض ان المتصفح قد تم اغلاقه واذا اراد المستخدم الدخول مرة ثانية نقوم بقراءة الـcookie اي session id من cookie وبعد ذلك نقوم بقراءة حالة المستخدم من الداتا بيس اذا كان offilne نغير حالته الى online نسمح له بالدخول ونحفظ session ID بالـcookie وإلا نقوم بالبحث عن الsession id الذي تم قرأت مسبقاً من cookie اذا كان موجود او لم تم اغلاقه اي الـsession نسمح له بالدخول

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#19

برضه لم تحل بهذه الطريقة .. لأن sessionID يتغير مع كل مره .. ماذا لو كان Online وأغلق المتصفح .. سينظر في الداتا بيز ويجده Online بغير SessionID السابق الذي سبق حفظه .. فلن يدخله !!!

إلا لو جعلت الكوكيز يحدث لها Expire سريع جداً ولحظي .. وهذا ستقابله بالتأكيد مشاكل أخرى متعلقة بالأداء ..

أنا قلت هذه الفكرة من قبل في هذا الموضوع ولكن بصيغة أخرى ..

على العموم جرب أخي واطرح لنا هنا نموذج من الكود .. وأكون شاكراً لك جداً لو وجدنا لها حلاً صحيحاً 100%

تقبل شكري وعرفاني

محمد قناوي

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

مواضيع مشابهة