سؤال

لدي موقع ويب في C#/ASP.NET قيد التطوير حاليًا. عندما نكون في الإنتاج ، أود أن أقوم بإطلاق الإصدارات بشكل متكرر على مدار اليوم ، حيث نصلح الأخطاء ونضيف ميزات (مثل هذا: http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/).

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

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

المحلول

إذا قمت بإجراء تغيير على ملف التكوين ، أو محتويات مجلد BIN في التطبيق ، أو أشياء من هذا القبيل ، فإن عملية ASP.NET للعامل إعادة تشغيلها مع تطبيقك.

يؤدي هذا إلى جلسات محذوفة ومستخدمي ركلهم.

الحل هو استخدام طرق تخزين الجلسة الأخرى بخلاف الافتراضي InProc.
يمكنك تحقيق ذلك عن طريق ضبط وضع حالة الجلسة. ال SqlServer و StateServer توفر الخيارات علاجًا جيدًا جدًا لمشكلتك.

SqlServer من السهل نسبياً إعداد الوضع والتشغيل. (في الأساس ، إنها مجرد إنشاء قاعدة بيانات ، وتشغيل ASPNET_REGSQL ، ثم تحديدها على التكوين.) إذا لم يكن لديك خادم MS SQL أو لا ترغب في استخدامه ، فيمكنك استخدامه StateServer, أو إنشاء مزود خاص بك واستخدم Custom الوضع.

التقييد الوحيد هو أنه لا يمكنك تخزين القيم القابلة للتسلسل إلا SqlServer و StateServer الوضع.

نصائح أخرى

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

سيكون أنظف مسار هو إلغاء تحميل جلستك إلى خادم حالة الجلسة ، أو تقليل استخدامك للجلسة.

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

هناك بديلان لتحقيق ذلك:

  1. لا تستخدم الجلسة على الإطلاق. (يمكنك استخدام ملفات تعريف الارتباط للمصادقة)
  2. استخدم وضع حالة جلسة أخرى. خادم الحالة أو SQLServer. http://msdn.microsoft.com/en-us/library/ms178586(v=vs.80).aspx

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

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

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

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

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