لماذا تستخدم أي وقت مضى لكائن تخزين ViewState ASP.NET عبر كائن تخزين الجلسة؟

StackOverflow https://stackoverflow.com/questions/575568

سؤال

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

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

خاصة مع ضوابط ASP.NET AJAX والتناقض، يمكن أن تصبح ViewState بسرعة متضخمة تتبع الولايات والمتغيرات المختلفة لجميع تلك الضوابط المختلفة وعناصر HTML.

ولكن بعد ذلك هو أن هناك عرض تخزين لمتغيرات الصفحة والكائنات على الإطلاق؟

ربما أنا في عداد المفقودين استخداما رائعا آخر لتخزين Page ViewState، هل يعرف أي شخص بشيء هناك؟

شكرا للقراءة!

تحرير: كان للجميع إجابة رائعة، آسف إذا لم تخترك.

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

المحلول

جلسات تنفد، Fiewstate لا - يمكنك العودة بعد ساعة وستظل Viewstate الخاص بك متاحة. Viewstate متاح أيضا باستمرار عند العودة / إلى الأمام على الموقع، وتغيير الجلسة.

نصائح أخرى

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

ViewState هي آلية لتذكر حالة المستخدم على العميل. الجلسة هي آلية لتذكر حالة المستخدم على الخادم.

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

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

بشكل عام، لا يوجد إجابة "حق" لاستخدامها. كل شيء عن ما تحاول إنجازه.

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

على سبيل المثال، قد يعمل طلبك في مزرعة كمبيوتر ولا يمكنك تكوين جلسة لاستخدام SQL Server. (أو استخدام SQL Server هو الكثير من ضرب الأداء)

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

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

ثم، والشيء الجيد هو أنه يمكنك الاستمرار بسهولة في استخدام عناصر تحكم الويب القياسية في .NET Framework، والذي سيعمل جميعا على استخدام ViewState / ControlState لهذا النوع من البيانات، دون انتفاخ ViewState. يمكن أن تكون آلية ثبات ذاكرة الخادم فعالة للغاية.

ليس حقا إجابة مباشرة على سؤالك، ولكن قد يحل مشكلتك.

يمكنك تخزين جانب خادم ViewState، والقضاء على الحمولة الخاصة بالعميل.

قم بإنشاء صف صفحة Worrits، وتجاوز PagestatePersister.http://msdn.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx.

 public class RussPage : Page
    {
         protected override PageStatePersister PageStatePersister
        {
            get
            {
                return new SessionPageStatePersister(Page);
            }
        }
    }

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

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

ليس إجابة لسؤالك ولكن أحد افتراضاتك غير صحيحة.

يمكن تمرير معرفات الجلسة في عنوان URL. لا تتطلب الجلسة ملفات تعريف الارتباط.

http://msdn.microsoft.com/en-us/library/aa479314.aspx.

<sessionState cookieless="true" />

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

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