سؤال: لماذا يتم فقدان الجلسة أحيانًا على بعض الأجهزة؟
الإجابة: قد يكون الأمر مرتبطًا ببيئة الجهاز، مثل جدار الحماية أو برنامج مكافحة الفيروسات. حاول إيقاف تشغيل جدار الحماية.
س: لماذا لا يتم تشغيل أسلوب Session_End عند استدعاء Session.Abandon؟
الإجابة: أولاً، تدعم طريقة Session_End جلسة العمل من النوع InProc (قيد المعالجة) فقط. ثانيًا، لتفعيل طريقة Session_End، يجب أن تكون الجلسة موجودة (أي أن الجلسة قد تم استخدامها في النظام)، ويجب إكمال طلب واحد على الأقل (سيتم استدعاء هذه الطريقة في هذا الطلب).
س: لماذا غالبًا ما يتم فقدان الجلسة الخاصة بي عندما أستخدمها في وضع InProc؟
الإجابة: تحدث هذه المشكلة عادةً بسبب إعادة تدوير التطبيق، لأنه عند استخدام الجلسة قيد التشغيل، يتم حفظ الجلسة في عملية aspnet_wp. عند إعادة تدوير العملية، ستختفي الجلسة بشكل طبيعي لتحديد ما إذا كانت العملية قد انتهت تم إعادة تدويرها، يمكنك استخدام التحقق من عارض الأحداث الخاص بنظامك للحصول على المعلومات.
للحصول على معلومات محددة، يرجى الرجوع إلى:
يتم فقدان متغيرات جلسة العمل بشكل متقطع في تطبيقات ASP.NET
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
كان هناك أيضًا خطأ في الإصدار 1.0 قد يتسبب في إعادة تدوير العملية المنفذة وإعادة تشغيلها. وقد تم إصلاح هذا الخطأ في الإصدار 1.1 وSP2.
للحصول على معلومات مفصلة حول هذا الخطأ، يرجى الرجوع إلى:
تتم إعادة تدوير عملية عامل ASP.NET (Aspnet_wp.exe) بشكل غير متوقع.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
سؤال: لماذا يكون معرف الجلسة الجديدة هو نفس معرف الجلسة الأصلية بعد انتهاء مهلة الجلسة أو تم التخلي عنها؟
الإجابة: نظرًا لأنه يتم حفظ معرف الجلسة في مثيل متصفح العميل، فعندما تنتهي مهلة الجلسة ويتم إعادة إنشاء الجلسة على الخادم، سيتم استخدام معرف الجلسة الذي مرره المتصفح، لذلك، بعد انتهاء مهلة الجلسة، لن يتغير معرف الجلسة بعد إعادة إنشائه.
س: لماذا يختلف معرف الجلسة لكل طلب؟
الإجابة: قد يكون سبب هذه المشكلة عدم حفظ أي معلومات في الجلسة، أي أن الجلسة لا يتم استخدامها في أي مكان في البرنامج. بعد حفظ المعلومات في الجلسة، سيكون معرف الجلسة دائمًا مرتبطًا بالمتصفح، ولن يتغير معرف الجلسة في هذا الوقت.
س: هل يمكن مشاركة الجلسة بين ASP وASP.NET؟
الجواب: نعم. ولكن هذه عملية معقدة نسبيًا. توفر Microsoft حلاً رسميًا، يرجى الرجوع إلى: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET .aspQ.
: ما أنواع الكائنات التي يمكن حفظها في الجلسة؟
الإجابة: يعتمد هذا على وضع الجلسة المستخدم عند استخدام جلسة قيد التشغيل (InProc)، يمكن حفظ أي كائن بسهولة. إذا كنت تستخدم وضعًا غير InProc، فيمكنك فقط حفظ الكائنات التي يمكن إجراء تسلسل لها وإلغاء تسلسلها. إذا كان الكائن المحفوظ في هذا الوقت لا يدعم التسلسل، فلا يمكن حفظه في جلسة هذا الوضع (غير InProc).
س: لماذا لا يمكنني استخدام طريقتي Response.Redirect وServer.Transfer في Session_End للانتقال إلى الصفحة؟
الإجابة: Session_End هي وظيفة معالجة الأحداث التي يتم إطلاقها داخل الخادم. يعتمد على مؤقت داخل الخادم. عند تشغيل الحدث، لا يوجد كائن HttpRequest ذي صلة على الخادم، لذلك لا يمكن استخدام طريقتي Response.Redirect وServer.Transfer في الوقت الحالي.
س: هل يمكنني الحصول على كائن HttpContext في Session_End؟
الإجابة: لا، لأن هذا الحدث غير مرتبط بأي طلب (Request) وليس له سياق قائم على الطلب.
سؤال: كيفية استخدام الجلسة في خدمة الويب؟
الإجابة: من أجل استخدام الجلسة في خدمة الويب، يحتاج المتصل بخدمة الويب إلى القيام ببعض الأعمال الإضافية، ويجب حفظ ملف تعريف الارتباط المستخدم عند الاتصال بخدمة الويب وتخزينه. للحصول على التفاصيل، الرجاء الرجوع إلى وثائق MSDN الخاصة بالخاصية HttpWebClientProtocol.CookieContainer. ومع ذلك، إذا كنت تستخدم خادمًا وكيلاً للوصول إلى خدمة الويب بسبب قيود إطار العمل، فلن يتمكن الاثنان من مشاركة الجلسة.
سؤال: لماذا لا يمكنني استخدام الجلسة عند تخصيص HttpHandler الخاص بي؟
الإجابة: عند تنفيذ HttpHandler الخاص بك، إذا كنت تريد استخدام الجلسة، فيجب عليك تنفيذ إحدى واجهات العلامات التالية: IRequiresSessionState وIReadOnlySessionState، ولا تحتوي هذه الواجهات على أي طرق تحتاج إلى التنفيذ، فهي مجرد واجهة علامة طريقة استخدام واجهة INamingContainer.
س: عندما أستخدم webfarm، لماذا يتم فقدان الجلسة عندما أقوم بإعادة التوجيه إلى خادم ويب آخر؟
الجواب: لمزيد من التفاصيل يرجى الرجوع إلى:
PRB: يتم فقدان حالة الجلسة في مزرعة الويب إذا كنت تستخدم وضع جلسة SqlServer أو StateServer
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: لماذا تعتبر الجلسة الخاصة بي غير صالحة في أسلوب Application_OnAcquireRequestState؟
الإجابة: لن تكون الجلسة صالحة إلا بعد استدعاء الحدث HttpApplication.AcquireRequestState.
للحصول على معلومات مفصلة يرجى الرجوع إلى:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
س: كيف يمكنني التوجيه من صفحة HTTP إلى HTTPS في حالة استخدام ملفات تعريف الارتباط؟
الإجابة: يرجى تجربة الطرق التالية:
String originalUrl = "/fxtest3/sub/foo2.aspx";
سلسلة معدلةUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
س: الجلسة صالحة في تلك الأحداث الموجودة في global.asax؟
الإجابة: الجلسة صالحة فقط بعد حدث AcquireRequestState، ويمكن للأحداث بعد هذا الحدث استخدام الجلسة.
س: كيف يتم حفظ كافة الكائنات في الجلسة الحالية؟
الإجابة: يمكن الحصول عليها عن طريق اجتياز جميع مفاتيح الجلسة. الرمز هو كما يلي:
ArrayList sessionCollection = new ArrayList();
foreach (سلسلة strKey في Session.Keys) {
sessionCollection.Add(Session[strKey]);
}
س: هل من الممكن مشاركة الجلسات في تطبيقات مختلفة؟
الإجابة: لا يمكن مشاركتها مباشرة. يمكنك الرجوع إلى كيفية مشاركة الجلسة بين ASP وASP.NET.
س: ما هو الفرق بين Session.Abandon وSession.Clear؟
الإجابة: الفرق الرئيسي هو أنه عند استخدام Session.Abandon، يتم استدعاء الأسلوب Session_End (في وضع InProc). سيتم تشغيل طريقة Session_Start عندما يأتي الطلب التالي. يقوم Session.Clear فقط بمسح كافة البيانات الموجودة في الجلسة ولا ينهي الجلسة، لذلك لن يتم استدعاء هذه الأساليب.
سؤال: من أجل الوصول إلى قيمة حالة الجلسة بشكل تسلسلي، هل توفر الجلسة آلية قفل؟
الإجابة: تطبق الجلسة آلية قفل القارئ/الكاتب:
عندما تحتوي الصفحة على إمكانات قابلة للكتابة للجلسة (أي أن الصفحة تحتوي على علامة <%@ Page EnableSessionState="True" %>)، فإن جلسة الصفحة تحمل قفل الكتابة حتى يكتمل الطلب.
عندما تحتوي الصفحة على وظيفة القراءة فقط للجلسة (أي أن الصفحة تحتوي على علامة <%@ Page EnableSessionState="ReadOnly" %>)، فإن الجلسة التي طلبت إكمال الصفحة تحمل قفل قراءة.
سيمنع قفل القراءة قفل الكتابة؛ ولن يمنع قفل القراءة قفل القراءة؛ وسيمنع قفل الكتابة جميع أقفال القراءة والكتابة. ولهذا السبب، عندما تكتب نفس الصفحة في إطارين في نفس الجلسة، يتعين على أحدهما انتظار الآخر (الأسرع قليلاً) حتى يكتمل قبل البدء في الكتابة.
س: ماذا يعني انتهاء مهلة الجلسة بشكل سلس؟
الإجابة: تعني المهلة السلسة للجلسة أنه طالما أن صفحتك تصل إلى (تستخدم) الجلسة، فسيتم تحديث المهلة (يمكن فهمها على أنها إعادة توقيت)، أي أنه سيتم إعادة حساب المهلة بدءًا من طلب الصفحة. ومع ذلك، لا يمكن للصفحة تعطيل الجلسة. سيتم الوصول تلقائيًا إلى جلسة الصفحة الحالية وتحديث المهلة.
سؤال: لماذا الجلسة غير صالحة في وظيفة معالجة الأحداث في global.asax؟
الإجابة: يعتمد ذلك على وظيفة معالجة الأحداث التي يتم استخدام الجلسة فيها. تكون الجلسة صالحة فقط بعد حدث AcquireRequestState. يمكن لجميع وظائف معالجة الأحداث بعد هذا الحدث استخدام الجلسة، ولكن ليس تلك التي قبلها.
سؤال: عندما أكتب مكونًا يعتمد على جلسة التطبيق الحالية، لماذا لا يمكنني استخدام Session["Key"] مباشرة للحصول على قيمته؟
الإجابة: جلسة ["Key"] هي في الواقع هذه.Session["Key"]، والتي يتم توفيرها كخاصية للصفحة، لذلك لا يمكنك استخدام هذه الخاصية مباشرة في المكون الخاص بك. يمكنك استخدام الجلسة بالطرق التالية:
HttpContext.Current.Session["Key"] = "قيمة الجلسة الخاصة بي";
س: عندما أستخدم وضع InProc لحفظ الجلسة، أين يتم حفظ الجلسة في هذا الوقت؟
الإجابة: لدى IISs المختلفة طرق معالجة مختلفة.
عند استخدام IIS5، يتم حفظ الجلسة في مساحة العملية aspnet_wp.exe.
عند استخدام IIS6، تشترك كافة التطبيقات في تجمع التطبيقات بشكل افتراضي، ويتم حفظ الجلسة في مساحة العملية w3wp.exe.
س: هل يتم إعداد مهلة الجلسة بالدقائق أم بالثواني؟
الجواب: إنها دقائق، والافتراضي هو 20 دقيقة.
س: هل سيتم حفظ جلستي عند حدوث خطأ في الصفحة؟ أحتاج إلى إجراء بعض عمليات التنظيف في Session_End، لكنها تفشل، لماذا؟
الإجابة: لن يتم تنفيذ Session_End إلا عند تشغيل الجلسة في وضع InProc. الحساب الذي تستخدمه Session_End هو الحساب الذي يقوم بتشغيل العملية المنفذة aspnet_wp (يمكن تعيين هذا في Machine.config). لذلك، إذا كنت تستخدم الأمان المتكامل للاتصال بـ SQL في طريقة Session_End، فسيتم فتح الرابط باستخدام حساب عملية aspnet_wp، ويعتمد النجاح أو الفشل في هذا الوقت على إعدادات أمان SQL الخاصة بك.
سؤال: لماذا أفقد الجلسة عندما أقوم بإعادة التوجيه عندما أقوم بتعيين "ملفات تعريف الارتباط" على "صحيح"؟
الإجابة: عند استخدام ملفات تعريف الارتباط، يجب عليك استخدام المسارات النسبية لاستبدال المسارات المطلقة في البرنامج. إذا كنت تستخدم المسارات المطلقة، فلن يتمكن ASP.NET من حفظ معرف الجلسة في عنوان URL.
على سبيل المثال: استبدل myDirmySubdirdefault.aspx بـ ..default.aspx.
سؤال: كيفية تخزين SortedList في الجلسة أو ذاكرة التخزين المؤقت؟
الجواب: يرجى الرجوع إلى الطرق التالية:
SortedList x = new SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
حفظ إلى الجلسة:
جلسة ["SortedList1"] = x;
استخدم الطريقة التالية للحصول عليها:
SortedList y = (SortedList) Session["SortedList1"];
الشيء نفسه ينطبق على تشاهي.
س: لماذا تظهر لي رسالة الخطأ "لا يمكن استخدام حالة الجلسة إلا عند تعيين EnableSessionState على القيمة true، إما في ملف تكوين أو في توجيه الصفحة"؟
الإجابة: قد تحدث هذه المشكلة بعد تثبيت Window Sharepoint Server (WSS) على جهاز قام بتثبيت بيئة تطوير Microsoft Visual Studio .NET.
سوف يقوم عامل تصفية WSS ISAPI بمعالجة كافة الطلبات. عند استعراض تطبيق ASP.NET من خلال دليل ظاهري، لا يقوم عامل تصفية ISAPI بتعيين عناوين URL لدليل المجلد.
الحل هو: لا تستخدم الجلسة على الجهاز المثبت عليه WSS.
للحصول على معلومات مفصلة يرجى الرجوع إلى:
لا يمكن استخدام حالة جلسة العمل في ASP.NET مع Windows SharePoint Services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: كيفية حذف متغيرات الجلسة؟
الإجابة: إذا كنت تريد حذف متغير الجلسة، فيمكنك استخدام الأسلوب HttpSessionState.Remove().
س: هل هناك طريقة لمعرفة مقدار الذاكرة التي تستهلكها جلسة التطبيق أثناء تشغيله؟
الجواب: لا. في الوقت الحالي، لا يمكن التحقق من هذه القيمة، على الأقل لم أر أي معلومات حول هذا الأمر حتى الآن. ومع ذلك، يمكن تقدير القيمة تقريبًا من خلال شاشة الأداء ورمز البرنامج.
سؤال: عندما تكون هناك مجموعة إطارات في الصفحة، يتبين أن معرف الجلسة الخاص بالصفحة المعروضة في كل إطار يختلف في الطلب الأول، لماذا؟
الإجابة: السبب هو أن مجموعة الإطارات الخاصة بك موضوعة على صفحة html بدلاً من صفحة ASPX.
في الظروف العادية، إذا كانت مجموعة الإطارات عبارة عن صفحة aspx، فعندما تطلب الصفحة، فإنها ترسل الطلب أولاً إلى خادم الويب، ويتم الحصول على معرف الجلسة، ثم يطلب المتصفح صفحات أخرى في الإطار على التوالي، بحيث يتم الحصول على معرف الجلسة معرف الجلسة لجميع الصفحات هو نفسه، إنه معرف الجلسة لصفحة FrameSet.
ومع ذلك، إذا كنت تستخدم صفحة Html لإنشاء صفحة FrameSet، فسيكون الطلب الأول هو صفحة HTML. عند إرجاع الصفحة من الخادم، لن يتم إنشاء أي جلسة، ثم سيطلب المتصفح الصفحات الموجودة في الإطار ستقوم الصفحات بإنشاء معرف الجلسة الخاص بها، لذلك تظهر هذه المشكلة في هذه الحالة. عندما تقوم بتحديث الصفحة، سيكون معرف الجلسة هو نفسه، وسيكون معرف الجلسة لآخر صفحة مطلوبة.
س: هل من الممكن حفظ جلسات تطبيقات مختلفة على قواعد بيانات مختلفة على نفس خادم SQL Server.
الجواب: نعم، يرجى الرجوع إلى:
تصحيح: قد يؤدي استخدام قاعدة بيانات SQL واحدة لكافة التطبيقات لحالة جلسة عمل SQL Server إلى حدوث اختناق
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: هل يمكنني الحصول على كائنات HttpSessionState وHttpContext صالحة في Session_End؟
الإجابة: يمكنك الحصول على كائن HttpSessionState بهذه الطريقة، ويمكنك الوصول إليه مباشرة باستخدام Session. ومع ذلك، لا يمكن الحصول على كائن HttpContext، لأن الحدث غير مرتبط بأي طلب، لذلك لا يوجد كائن سياق.
س: عند استخدام الجلسة في وضع SQL Server، لماذا لا تنتهي صلاحية الجلسة الخاصة بي؟
الإجابة: في وضع SqlServer، تكتمل انتهاء صلاحية الجلسة من خلال تسجيل وكيل SQL. يرجى التحقق مما إذا كان عامل SQL الخاص بك قيد التشغيل.
س: بعد أن قمت بتعيين EnableSessionState على "للقراءة فقط"، لا يزال بإمكاني تعديل قيمة الجلسة في وضع InProc. لماذا يحدث هذا؟
الإجابة: حتى إذا تم وضع علامة على EnableSessionState للقراءة فقط، فلا يزال بإمكان المستخدمين تحرير الجلسة في وضع InProc. والفرق الوحيد هو أن الجلسة لن يتم قفلها أثناء الطلب.
س: كيف يمكنني تجنب تحديد كلمة مرور عند ربط SQL؟
الإجابة: استخدم رابطًا موثوقًا به أو استخدم سلسلة ارتباط مشفرة. لمزيد من المعلومات حول هذا يرجى الرجوع إلى:
كيفية استخدام الأداة المساعدة ASP.NET لتشفير بيانات الاعتماد وسلاسل اتصال حالة الجلسة
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290Q
: كيف يمكنني استخدام الجلسة في صفي الخاص؟
الإجابة: يمكنك استخدام HttpContext.Current.Session والطريقة المحددة هي كما يلي:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
وبالمثل يمكنك استخدام كائن التطبيق بهذه الطريقة.
س: لماذا يتم تعليق طلبي بعد التبديل إلى وضع SQL Server؟
الإجابة: تحقق مما إذا كان من الممكن حفظ كافة الكائنات المحفوظة في الجلسة في وضع SQL Server، أي أن هذه الكائنات يجب أن تدعم التسلسل.
سؤال: ما هو التأثير عندما يتم تعيين الجلسة على أنها بدون ملفات تعريف الارتباط؟
الإجابة: عند تعيين Cookieless على true، توجد القيود التالية بشكل أساسي:
1. لا يمكن استخدام الروابط المطلقة في الصفحة
2. بالإضافة إلى التبديل بين HTTP وHTTPS، يجب إكمال بعض الخطوات الأخرى في التطبيق.
إذا قمت بإرسال رابط إلى شخص آخر، فسيحتوي عنوان URL في هذا الوقت على معلومات معرف الجلسة، وبالتالي سيشارك الشخصان الجلسة.
س: هل يمكن حفظ الجلسة في قاعدة البيانات؟
الإجابة: بالطبع لمزيد من التفاصيل يرجى الرجوع إلى: http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
--------------- ------------------------------------------------------------------ ------------------------------------------------------------------ -- -
س: لماذا غالبًا ما يتم فقدان الجلسة الخاصة بي عندما أستخدمها في وضع InProc؟
موقف إضافي: إذا كنت تستخدم قاعدة بيانات Access، لمنع تنزيل قاعدة البيانات، فقد يفكر بعض الأشخاص في وضع ملف قاعدة البيانات في دليل bin بحيث لا يمكن تنزيل قاعدة البيانات، إذا كانت في وضع InProc سيؤدي هذا أيضًا إلى فقدان الجلسة. لأنه عند الوصول إلى التطبيق، ستتم كتابة البيانات إلى قاعدة البيانات بشكل متكرر، مما سيؤدي إلى تغييرات في ملفات قاعدة البيانات الموضوعة ضمن دليل bin، وستؤدي التعديلات على دليل bin إلى فقدان الجلسة.
لحل هذه المشكلة، يمكنك تغيير مسار تخزين ملف قاعدة البيانات، أو استخدام وضع StateServer أو SqlServer.
لمزيد من المعلومات، يرجى الرجوع إلى:
PRB: يتم فقدان بيانات الجلسة عند استخدام وضع حالة جلسة ASP.NET InProc
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- -----------------------
جلسة مشتركة متعددة المشاريع في Asp.net مختارة من مدونة dnyz
http://dev.csdn.net/article/21/21714.shtm
1. قم بإنشاء حل فارغ، مثل: d:MyProjectMyProject.sln
2. قم بإنشاء الدليل الجذر لتطبيق الويب d:MyProjectWebMis ضمن d:MyProject وقم بتعيينه على الدليل الظاهري لـ http://localhost/WebMis
3. قم بإنشاء أدلة جديدة وفقًا للوحدات الموجودة في دليل WebMis، مثل: d:MyProjectWebMisLogin وd:MyProjectWebMisCheckOut
4. قم بإنشاء تطبيق ويب جديد يعتمد على الوحدة النمطية الموجودة في VS.net، مثل: http://localhost/WebMis/Login و http://localhost/WebMis/CheckOut
5. بعد الإنشاء، يتم تعيين دليلي تسجيل الدخول والخروج تلقائيًا كدلائل افتراضية.
6. أضف مراجع المشروع لتسجيل الدخول والخروج في مشروع WebMis
7. احذف الدلائل الافتراضية لتسجيل الدخول والخروج في مدير IIS
8. احذف global.asax لكل مشروع (أزل المشروع الجذر)
9. قم بإزالة التعليمة البرمجية التالية في web.config الخاص بالمشروع (قم بإزالة المشروع الجذر):
<وضع المصادقة = "Windows" />
<sessionState mode="InProc"stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="مصدر البيانات=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
أو احذف web.config (إذا لم تكن بحاجة إلى تكوينه في كل دليل)
10. بعد التجميع، يمكن تشغيله.