asp.net-mvc - ماهو - mvc microsoft




هل هناك أفضل الممارسات وأوصى بديلا للمتغيرات جلسة في MVC (2)

متى

قواعد البيانات هي الأمثل للغاية. تعتبر القيمة البسيطة مثل عدد عربات التسوق مرشحًا جيدًا للتخزين المؤقت من خلال قاعدة البيانات ، (ومن المأمول) أن يكون حسابًا رخيصًا تمامًا. قد يكون غير قضية.

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

Cache جيدة للقيم على مستوى الموقع ، أو القيم الخاصة بالمستخدم بمفاتيح فريدة. ومع ذلك ، قد يكون من الصعب مزامنة ذاكرة التخزين المؤقت عبر عدة خوادم ويب. ستبقى حالة جلسة المعالجة خارج الحالة متزامنة نظرًا لأنه يتم تخزينها في موقع واحد (قاعدة بيانات أو خادم حالة).

بالطبع ، هناك العديد من بدائل التخزين المؤقت للطرف الثالث مع خيارات متنوعة للحفاظ عليها متزامنة.

بغض النظر عن مكان تخزين العدد مؤقتًا ، فأنا أرى أنه يجب تخزين عربات التسوق نفسها في قاعدة البيانات بحيث يكون لدى المستخدمين خيار العودة لاحقًا والمتابعة من حيث توقفوا.

أداء

إذا كنت تستخدم حالة جلسة عمل المعالجة (على سبيل المثال في بيئة تحميل متوازنة و / أو لجعل جلسة أكثر متانة) ، فستضرب قاعدة بيانات أو تستدعي خدمة خارج الخدمة ، ولكن المكالمة رخيصة نسبيًا ما لم تكن تقوم بتسلسل كائن كبير الرسوم البيانية.

يتم تحميل الجلسة مرة واحدة لكل طلب. الوصول قراءة اللاحقة سريع جداً.

الكتابة إلى الجلسة يمكن أن تكون ضارة بالأداء ، حتى عندما لا يكون هناك حمولة. لماذا ا؟ تستخدم معظم التطبيقات الحديثة استدعاءات غير متزامنة ، وعندما تصل عدة مكالمات غير متزامنة إلى معالج HTTP (الصفحة ، وحدة التحكم ، إلخ) التي تقرأ / تكتب الجلسة ، سيقوم ASP.Net بقفل الجلسة لإجراء تسلسل للوصول. لتجنب هذا ، يمكنك تزيين وحدات التحكم الخاصة بك بـ [SessionState( SessionStateBehavior.ReadOnly )]

التصميم

الآن لقد أنجزت هذه المهمة بنجاح عن طريق تعيين القيمة لمتغير جلسة الذي تم استرجاعه من طريقة عرض _layout الخاصة بي ؛

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

قرأت في مكان ما استخدام مرشحات MVC جنبًا إلى جنب مع قسم بدء تشغيل تطبيق Global.ascx أيضًا ، ولكن هذا لا يبدو مناسبًا للمتغيرات التي تم تعيينها على مستوى وحدة التحكم بقدر ربما المتغيرات الثابتة.

المتغيرات الساكنة لها استخدامات مشروعة تمامًا ، ولكن يجب عليك فهمها تمامًا أو المخاطرة بمشاكل خطيرة.

انظر إجاباتي المتعلقة بالمتغيرات الثابتة في ASP.Net:

حسنًا ، أولاً قبل أن يحاول أي شخص اتخاذ قرار بأن هذا سؤال "مكرر" ؛ لقد راجعت معظم المشاركات في SO حول أسئلة مماثلة ولكن حتى في تركيبة من كل ما قيل ، ما زلت في ورطة إلى حد ما بالنسبة للنهائية أو ربما ينبغي أن أقول اتفاق بالإجماع على هذا.

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

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

الآن لقد أنجزت هذه المهمة بنجاح عن طريق تعيين القيمة لمتغير جلسة الذي تم استرجاعه من طريقة عرض _layout الخاصة بي ؛ لذلك حتى عندما يقوم المستخدم بالتنقل في أي مكان داخل الموقع ، سيستمر عدد العناصر في سلة التسوق حتى يغادر الموقع أو يكمل عملية الدفع ؛ في هذه الحالة سيتم مسح المتغير في الكود.

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

الشيء الآخر الذي قرأته يشير إلى أن متغيرات جلسة العمل يمكن أن تعيق الأداء الإجمالي إذا كان هناك حركة مرور عالية على الموقع حيث يتم تخزين المعلومات على الخادم.

أنا شخصيا لا يمكن أن يبرر تخزين هذا النوع من المعلومات في قاعدة بيانات وبعد ذلك الوصول إلى قاعدة البيانات كما أتصور أن هذا يمكن أن يؤثر أيضا على أداء الموقع ويبدو مبالغا فيه قليلا لتخزين البيانات المؤقتة. لا تعمل TempData و ViewData و ViewBag في استمرار البيانات بحيث لا تكون اختيارات منطقية لمتطلبات IMO.

إذا كان هناك بديل آخر مناسب تمامًا لمتغير الجلسة (الذي يعمل من أجلي) ، أود أن أعرف ما هو.

2 المشاركات التي تبدو متناقضة في جهد تقديم أفضل التوصيات تترك لي مرتبكة بعض الشيء.

العيوب: هل من الممارسات الجيدة تجنب استخدام حالة الجلسة في ASP.NET MVC؟ إذا كانت الإجابة بنعم ، لماذا وكيف؟

الايجابيات: لا يزال موافق على استخدام متغيرات الجلسة في ASP.NET mvc ، أو هل هناك بديل أفضل لبعض الأشياء (مثل عربة)

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

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

قرأت في مكان ما استخدام مرشحات MVC جنبًا إلى جنب مع قسم بدء تشغيل تطبيق Global.ascx أيضًا ، ولكن هذا لا يبدو مناسبًا للمتغيرات التي تم تعيينها على مستوى وحدة التحكم بقدر ربما المتغيرات الثابتة.

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

بالطبع ، إذا كان هذا السؤال ليس لديه إجابة محددة ؛ قل لي ذلك وسأحاول استنتاج إجابتي الخاصة من المشاركات الأخرى.

شكر

================================================== =========

استجابة محدثة للأجوبة المقدمة

يبدو أن التخزين المؤقت وملفات تعريف الارتباط هي تفضيل عام من الاستجابات ، ولكني أيضًا لاحظت العبارة التي تفيد بأن التخزين المؤقت ليس مرشحًا مثاليًا لاستخدامه عبر خادم ويب متعدد لأن التزامن يمكن أن يكون مشكلة محتملة.

من خلال منح الائتمان لـ Tim ، تم توضيح أن تخزين قاعدة البيانات قد تم تحسينه وأن المستخدمين لديهم خيار العودة في وقت لاحق والمتابعة من حيث توقفوا.

هذه نقطة ممتازة ، ولكن مع مراعاة الاحتمالات ؛ من المحتمل أن يكون معقولاً نظراً لأن بعض المستخدمين قد لا يعودوا إلى ترك البيانات غير الضرورية في قاعدة البيانات.

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

ومع ذلك ، فإنني أحترم توصية تيم وأعتقد أنها تستحق الجدارة في مواجهة رأيي الأولي إلى درجة ما. أن قاعدة البيانات لا تبدو خيارًا قابلاً للتخزين لتخزين البيانات المؤقتة ؛ لذلك أعتقد أن الحل الوسط سيكون تخزين البيانات في قاعدة بيانات (في ضوء سيناريو سلة التسوق أو ما شابه) ربما بعد الخروج. بهذه الطريقة كما ذكرت سابقًا ، قد يتم تتبع البيانات باستمرار عند الزيارات اللاحقة حتى يكون لديك سجل للمعاملات. ولكن الأهم من ذلك ، ستكون بيانات تلك المعاملات ذات الصلة الحقيقية بالاستمرار في قاعدة البيانات.

وذكر أيضا أنه على الرغم من أن الدورة أسرع من قاعدة البيانات ؛ ولكن على الرغم من ذلك ، يمكن التخفيف من التحذيرات التي يمكن إلى حد ما من خلال آليات أخرى مثل الاستفادة من سمة SessionStateBehavior ، فقط بمثابة مثال واحد.

ولكن ... أعتقد أن نوع Erik قاد المنزل نقطة مع تأثير Dunning-Kruger. على الرغم من ذلك ، من محتوى وشروحات للإجابات المقترحة الواردة هنا ؛ أنا أشك بشكل جدي في خبرة أي من الأفراد الذين استجابوا لأية طريقة مشكوك فيها. ومع ذلك ، فإنني أميل إلى الاتفاق على حقيقة أن الحصول على رأي بالإجماع قد يكون إلى حد ما توقعات أعلى من التوقعات من جانبي.

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

==================================================

الملخص على أساس التعليقات:

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

  2. يُفضل التخزين المؤقت على متغيرات جلسة العمل ، ولكن ليس بالضرورة الخيار القابل للتحجيم "الأفضل" بسبب أشياء أخرى لتعقيدات التزامن المحتملة في بيئات المزرعة لخوادم الويب كما أشرنا سابقاً. لكن الخيار مع ذلك.

  3. تخزين قاعدة البيانات قابلة للتوسعة ولكن الغرض من التخزين المؤقت المتقلب ربما لا يكون الخيار الأكثر أناقة من منظور قاعدة البيانات لأنه يتطلب تنظيفًا دوريًا. شخصياً ، وجود أساس قوي في مفاهيم قواعد البيانات في بداية مسيرتي ، ربما لن يكون ذلك أمرًا قد يتفق معه العديد من المطورين ؛ ولكن استخدام قاعدة البيانات لهذا الغرض قد يكفي لتنمية الويب من منظور المبرمجين ؛ ومع ذلك من منظور تطوير DAL و DB ، (هذا لدي) لديه القدرة على تفويض مهمة DB إضافية لفرض خلفية فعالة.

  4. يبدو أن ملفات تعريف الارتباط خيار جيد بوجود العناصر "المرغوبة" المدمجة لمتغيرات جلسة العمل والتخزين المؤقت.

==================================================

استنتاج

بناء على الإجابات أعتقد أن COOKIES و CACHING يبدوان بشكل عام مقربين بشكل جيد لأفضل الممارسات في جميع المجالات بالإضافة إلى تخزين قاعدة البيانات عندما يتطلب استمرار الثبات بعد الحقيقة ؛ كمرشحين جيدين محتملين لقابلية تطوير تلك المقدمة.

يبدو أن الاختيار النهائي بين 2 يستند إلى كمية ونوع البيانات التي تتطلب التخزين (مثل الحساسية مقابل غير الحساسة وما إذا كان هناك أي قلق قد يغير العميل البيانات من نهايته) ؛ بالإضافة إلى اعتبارات خاصة لـ COOKIES في حقيقة أنه قد يتم تعطيلها من قبل العملاء.

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

لأن كل الإجابات جيدة ؛ سوف أذهب إلى حدٍّ ما لأعتمد جميع المشاركات على أنها مفيدة وستقبل إجابة إريك كحل شامل قابل للتوسع بشكل جيد. أتمنى أن أتمكن من اختيار أكثر من إجابة واحدة مقبولة لأنني أعتقد أن استجابة تيم كانت جيدة للغاية وموجزة.

كان رد غوبتا جيدًا أيضًا ، لكني أردت المزيد من التفاصيل حول الإجابة المقترحة وليس تكرارًا للوظائف السابقة.

شكرا يا شباب!


بديلة الدورة في مختلف المحتملين: -

عندما تحتفظ بشيء ما في الجلسة ، يكسر القاعدة الأساسية في ASP.NET MVC. يمكنك استخدام هذه الخيارات كبديل للجلسة.

إذا كانت جلسة asp.net (MVC) الخاصة بك تقوم بعمل boxing على الصندوق ، فهذا يجعل التحميل قليلاً على الخادم. جرب هذه الفكرة

  1. التخزين المؤقت: - يمكن تخزين تخزين قائمة أو شيء آخر مثل البيانات الكبيرة في الجلسة بشكل أفضل في التخزين المؤقت. يمكنك التحكم في الوقت الذي تريد فيه أن تنتهي صلاحيته بدلاً من جلسة المستخدم.

  2. إذا كان التطبيق الخاص بك يعتمد على بيانات JSON / Ajax ، فيمكنك استخدام نوع من الوظائف المتوفرة في html5 (مثل WebSQL ، IndexDB). لن يستخدم ملف تعريف الارتباط حتى يمكنك حفظ بعض عبء العمل على الخادم.





session-variables