سؤال

أنا يريد أن متجر "الدولة" من بعض إجراءات المستخدم هو إجراء في سلسلة مختلفة ASP.Net webforms.ما هي الخيارات من أجل استمرار الدولة و ما هي إيجابيات/سلبيات كل حل ؟

لقد تم استخدام الدورة الكائنات باستخدام بعض الطرق المساعد بقوة نوع الكائنات:

    public static Account GetCurrentAccount(HttpSessionState session)
    {
        return (Account)session[ACCOUNT];
    }

    public static void SetCurrentAccount(Account obj, HttpSessionState session)
    {
        session[ACCOUNT] = obj;
    }

لقد قيل لي من قبل العديد من المصادر أن "الدورة الشر", لذلك هذا هو حقا السبب هذا السؤال.أريد أن أعرف ما هو رأيك "أفضل الممارسات" و لماذا.

هل كانت مفيدة؟

المحلول

لا يوجد شيء أصلا الشر مع حالة جلسة العمل.

وهناك زوجين من الأشياء أن نأخذ في الاعتبار أنه قد لدغة لك على الرغم من:

  1. إذا كان المستخدم بالضغط على المتصفح مرة أخرى على زر يمكنك العودة إلى الصفحة السابقة لكن الدورة لم تكن الدولة عادت.حتى CurrentAccount قد لا يكون ما كان عليه في الأصل على الصفحة.
  2. ASP.NET العمليات يمكن الحصول على المعاد تدويرها بواسطة IIS.عندما يحدث ذلك لك الطلب التالي سوف تبدأ عملية جديدة.إذا كنت تستخدم في عملية الدورة الدولة ، الافتراضي ، سيكون من ذهب :-(
  3. الدورة يمكن أيضا مهلة مع نفس النتيجة إذا كان المستخدم غير نشط لبعض الوقت.هذا التخلف إلى 20 دقيقة حتى غداء لطيفة سوف تفعل ذلك.
  4. باستخدام الخروج من عملية الدورة الدولة يتطلب من جميع الكائنات المخزنة في الدورة الدولة أن يكون قابل للتسلسل.
  5. إذا كان المستخدم فتح نافذة متصفح أخرى وقال انه سوف تتوقع أن يكون الثاني و متميزة التطبيق ولكن الدورة الدولة هو الأرجح سوف تكون مشتركة بين اثنين.حتى تغيير CurrentAccount في نافذة المتصفح سوف تفعل الشيء نفسه في الآخر.

نصائح أخرى

اثنين من خيارات التخزين المؤقت بيانات النموذج هي: أولا ، لتخزين كل شكل من معلومات في الدورة دولة variable(s) و الثاني لتمرير شكل المعلومات جنبا إلى جنب باستخدام معلمات عنوان URL.باستخدام ملفات تعريف الارتباط المحتملة الخيار الثالث هو ببساطة غير قابلة للتطبيق لسبب بسيط هو أن العديد من الزوار من المرجح أن يكون لديك ملفات تعريف الارتباط إيقاف (هذا لا يؤثر على ملفات تعريف الارتباط ، ومع ذلك).أيضا, أنا على افتراض طبيعة سؤالك أنك لا تريد تخزين هذه المعلومات في جدول قاعدة بيانات حتى يتم التزاما تاما.

باستخدام متغير الدورة(s) هو الكلاسيكية حل هذه المشكلة ولكنها لا تعاني من عدد قليل من العيوب.ومن بين هذه (1) كميات كبيرة من البيانات يمكن استخدام ما يصل server RAM إذا كنت تستخدم inproc دورة إدارة (2) تقاسم متغيرات جلسة العمل عبر ملقمات متعددة في مزرعة خادم يتطلب اعتبارات إضافية ، و (3) مهنيا تصميم التطبيق يجب الاحتراس دورة انتهاء الصلاحية (لا يلقي الدورة متغير واستخدامها - إذا كانت الدورة قد انتهت الزهر رمي خطأ).ومع ذلك ، فإن الغالبية العظمى من تطبيقات الدورة المتغيرات هي بلا شك وسيلة للذهاب.

البديل هو لتمرير كل شكل من أشكال المعلومات جنبا إلى جنب في URL.المشكلة الرئيسية مع هذا النهج هو أن عليك أن تكون حذرا للغاية حول "نقل المعلومات".على سبيل المثال, إذا كنت جمع المعلومات في أربع صفحات ، سوف تحتاج إلى جمع المعلومات في الأولى ، تمريرها في عنوان الصفحة الثانية حيث يجب تخزينه في تلك الصفحة viewstate.ثم عند استدعاء الصفحة الثالثة ، عليك جمع بيانات النموذج من الصفحة الثانية بالإضافة إلى viewstate المتغيرات ترميز سواء في URL ، الخ.إذا كان لديك خمس صفحات أو أكثر أو إذا كان الزائر سوف يكون القفز في جميع أنحاء الموقع ، عليك فوضى حقيقية على يديك.نضع في اعتبارنا أيضا أن جميع المعلومات التي سوف تحتاج إلى أ) يكون تسلسل إلى رابط آمن سلسلة ب) المشفرة في مثل هذه الطريقة لمنع بسيطة URL على أساس الخارقة (مثلا ، إذا وضعت السعر في النص الواضح و تمر على شخص يمكن تغيير السعر).لاحظ أنه يمكنك تقليل بعض من هذه المشاكل من خلال خلق نوع من "مدير الدورة" ويكون ذلك إدارة URL سلاسل لك ولكن سوف لا يزال لديك إلى أن تكون حساسة للغاية إلى إمكانية أن أي رابط يمكن أن تنفجر شخص كامل الدورة إذا لم تدار بشكل صحيح.

في النهاية, أنا URL استخدام المتغيرات فقط يمر على طول محدودة للغاية البيانات من صفحة واحدة إلى أخرى (مثلا ، عنصر معرف ترميز في رابط هذا البند).

دعونا نفترض إذن أن كنت في الواقع إدارة بيانات المستخدم باستخدام المدمج في جلسات القدرة.لماذا أخبرك أحدهم أن "الدورة الشر" ؟ حسنا, بالإضافة إلى تحميل ذاكرة الخادم المزرعة انتهاء الاعتبارات الواردة أعلاه الأولية نقد الدورة المتغيرات التي هم, فعال, مصنف المتغيرات.

لحسن الحظ, من الحكمة استخدام متغيرات جلسة العمل يمكن تجنب مشاكل في الذاكرة (الكبير البنود يجب أن تبقى في قاعدة البيانات على أية حال) و إذا كنت تقوم بتشغيل موقع كبير بما يكفي حاجة مزرعة خادم, هناك الكثير من الآليات المتاحة لتقاسم الدولة التي بنيت في ASP.NET (تلميح:عدم استخدام inproc التخزين).

لتجنب أساسا كل ما تبقى من الدورة عيوب ، أوصي بأن تنفيذ كائن إلى عقد جلسة البيانات وكذلك بعض بسيطة كائن جلسة قدرات الإدارة.ثم بناء هذه إلى سليل الصفحة الدرجة استخدام هذا سليل فئة الصفحة على كل الصفحات الخاصة بك.ومن ثم مسألة بسيطة للوصول إلى بيانات جلسة العمل الخاصة بك عن طريق صفحة الفئة مجموعة من كتابة بشدة القيم.لاحظ أن الكائن الحقول سوف تعطيك وسيلة للوصول إلى كل من "متغيرات جلسة العمل" في كتابتها بقوة نحو (مثلا ، حقل واحد لكل متغير).

اسمحوا لي أن أعرف إذا كان هذا هو مهمة واضحة بالنسبة لك أو إذا كنت ترغب بعض التعليمات البرمجية!

بقدر ما أعرف ، Session هو يقصد طريقة تخزين هذه المعلومات.يرجى أن نضع في اعتبارنا أن الدورة الدولة عموما يتم تخزينها في العملية بشكل افتراضي.إذا كان لديك عدة ملقمات ويب ، أو إذا كان هناك إعادة تشغيل IIS ، تفقد حالة جلسة العمل.وهذا يمكن أن تكون ثابتة عن طريق استخدام ASP.NET خدمة الدولة ، أو حتى قاعدة بيانات SQL تخزين جلسات.هذا يضمن الناس الحصول على الدورة ، حتى لو كانوا انتقلوا إلى مختلف خادم الويب ، أو في حالة إعادة تدوير من عملية العامل.

واحدة من أسباب شريرة سمعة سارع المطورين الإفراط في ذلك مع سلسلة حرفية في واجهة المستخدم رمز (بدلا من مساعد من الدرجة مثلك) كما في البند مفاتيح, و ينتهي مع حقيبة كبيرة من غير قابل للفحص منحل الدولة.نوعا من المجمع هو مستوى الدخول شرط غير الشر الدورة الاستخدام.

أما بالنسبة "الدورة الشر" ...إذا كنت النامية في ASP الكلاسيكية وأود أن نتفق, ولكن ASP.NET/IIS لا وظيفة أفضل بكثير.

السؤال الحقيقي هو: ما هي أفضل طريقة للحفاظ على الدولة.في حالتنا, عندما يتعلق الأمر الحالي في تسجيل المستخدم ، نقوم بتخزين هذا الكائن في الدورة ، كما نحن باستمرار مشيرا إلى أنها اسم, عنوان البريد الإلكتروني, إذن وما إلى ذلك.

الصغيرة الأخرى الحكايات من المعلومات التي لا تحتاج إلى أي طويل الأجل استمرار نحن نستخدم مزيج من الكوكيز و viewstate.

عندما كنت ترغب في تخزين المعلومات التي يمكن الوصول إليها عالميا في تطبيق الويب الخاص بك ، طريقة للقيام بذلك هو ThreadStatic السمة.هذا يتحول static عضو Class إلى الأعضاء التي يتم مشاركتها من قبل الترابط الحالي, ولكن ليس غيرها من المواضيع.ميزة ThreadStatic هو أن لا يكون لديك سياق شبكة الإنترنت المتاحة.على سبيل المثال, إذا كان لديك الخلفية التي لا تشير System.Web, ولكن ترغب في مشاركة المعلومات هناك كذلك, يمكنك تعيين المستخدم id في بداية كل طلب في ThreadStatic مكان الإقامة ، مرجع له في التبعية من دون الحاجة إلى الوصول إلى Session الكائن.

لأنه static ولكن فقط على موضوع واحد, علينا أن نضمن أن آخر وقت واحد لا يحصل الزوار على دورتنا.يعمل هذا, طالما يمكنك التأكد من أن العقار هو إعادة تعيين كل طلب.هذا يجعلها الرفيق المثالي إلى ملفات تعريف الارتباط.

أعتقد أن استخدام كائن جلسة عمل طيب في هذه الحالة, ولكن يجب أن نتذكر الدورة يمكن أن تنتهي إذا كان هناك أي متصفح النشاط لفترة طويلة (HttpSessionState.مهلة الملكية يحدد في كم دقيقة حالة جلسة مزود ينهي الدورة) ، لذلك فمن الأفضل للتحقق من قيمة وجود قبل العودة:

public static Account GetCurrentAccount(HttpSessionState session)
{
    if (Session[ACCOUNT]!=null)
        return (Account)Session[ACCOUNT];
    else
        throw new Exception("Can't get current account. Session expired.");
}

على المدى القصير المعلومات التي يحتاج فقط أن أعيش حتى الطلب ، ويمكن أيضا أن يتم تخزين في ViewState.وهذا يعني أن الكائنات هي تسلسل وتخزينها في الصفحة إرسالها إلى المتصفح ، ثم نشر مرة أخرى إلى الخادم في الحدث انقر فوق أو ما شابه ذلك.ثم ViewState هو فك وتحولت إلى كائنات مجددا استعداد الجزائر.

الدورات ليست شريرة ، فهي تؤدي وظيفة هامة في ASP.NET تطبيق خدمة البيانات التي يجب أن تكون مشتركة بين صفحات متعددة خلال المستخدم "الدورة".هناك بعض الاقتراحات, وأود أن أقول أن استخدام SQL إدارة الدورة في أي وقت ممكن ، والتأكد من أن الكائنات التي تستخدم في الدورة مجموعة "تسلسل".أفضل ممارسات استخدام كائن جلسة عمل عندما كنت في حاجة على الإطلاق إلى حصة الدولة المعلومات عبر صفحات و لا تستخدم عندما كنت لا حاجة إليها.المعلومات لن تكون متاحة من جانب العميل ، الدورة الرئيسية يتم الاحتفاظ بها إما في ملف تعريف الارتباط, أو من خلال سلسلة الاستعلام أو باستخدام أساليب أخرى اعتمادا على كيفية تكوينه ، ثم الدورة الأشياء متوفرة في قاعدة بيانات الجدول (إلا إذا كنت تستخدم InProc ، وفي هذه الحالة جلسات العمل الخاصة بك سيكون لديك فرصة مهب خلال تحديث من الموقع ، أو تكون عديمة تقريبا في معظم متفاوت البيئات).

أعتقد أن "الشر" تأتي من الإفراط في استخدام الدورة.إذا كنت مجرد عصا أي شيء وكل شيء في ذلك (مثل استخدام المتغيرات العالمية في كل شيء) سوف ينتهي بعد الأداء الضعيف و مجرد فوضى.

أي شيء كنت وضعت في الدورة كائن يبقى هناك مدة الدورة ما لم يتم تنظيفها.سوء إدارة الذاكرة المخزنة باستخدام inproc و stateserver سوف يجبرك على نطاق واسع في وقت سابق من اللازم.مخزن فقط معرف الدورة/المستخدم في الدورة و الحمل ما هو بحاجة إلى ذاكرة التخزين المؤقت الكائن على الطلب باستخدام فئة المساعد.وبهذه الطريقة يمكنك ضبط انها مدى الحياة وفقا كيف في كثير من الأحيان أن البيانات استخدمت الولايات المتحدة.النسخة القادمة من asp.net قد يكون توزيع ذاكرة التخزين المؤقت(الشائعات).

الدورة الشر:لا في ASP.NET التي تم تكوينها بشكل صحيح.نعم, انها مثالية تكون عديمي الجنسية ممكن ، ولكن الواقع هو أنه لا يمكنك الوصول إلى هناك من هنا.ومع ذلك ، يمكنك جعل الدورة تتصرف بطرق تقليل تأثيره-لا سيما StateServer أو قاعدة بيانات الدورات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top