سؤال

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

FWIW، أنا لا أدير مزرعة ويب.

استثناء

رسالة خطأ:غير قادر على التحقق من صحة البيانات.

مصدر الخطأ:System.Web

الموقع المستهدف للخطأ:بايت [] getDecodedData (بايت [] ، بايت [] ، int32 ، int32 ، int32 byref)

أرسل البيانات

حالة العرض:

/wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ+CKsnB

التحقق من صحة الحدث:

/wEWBAK+8ZzHAgKOhZRcApDF79ECAoLch4YMeQ2ayv/Gi76znHooiRyBFrWtwyg=

تتبع مكدس الاستثناء

   at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
   at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
   at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
   at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
   at System.Web.UI.HiddenFieldPageStatePersister.Load()
   at System.Web.UI.Page.LoadPageStateFromPersistenceMedium()
   at System.Web.UI.Page.LoadAllState()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.default_aspx.ProcessRequest(HttpContext context)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

~ ويليام رايلي لاند

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

المحلول

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

الأسباب المحتملة الأخرى:

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

تحديث: مقالة مايكروسوفت حول هذه القضية.بالإضافة إلى ما سبق، يقترحون سببين محتملين آخرين:

  • تعديل حالة العرض بواسطة برامج جدران الحماية/مكافحة الفيروسات
  • النشر من صفحة aspx إلى أخرى.

نصائح أخرى

في .NET 3.5 SP1 RenderAllHiddenFieldsAtTopOfForm تمت إضافة الخاصية إلى تكوين PagesSection.

Web.config

<configuration>

    <system.web>

        <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>

    </system.web>

</configuration>

ومن المثير للاهتمام أن القيمة الافتراضية لهذا صحيحة.لذا، في الأساس، إذا كنت تستخدم .NET 3.5 SP1، فسيتم عرض ViewState تلقائيًا في الجزء العلوي من النموذج (قبل تحميل بقية الصفحة) وبالتالي يتم التخلص من خطأ ViewState الذي تحصل عليه.

لقد واجهت المشكلة مع إصدارات معينة من Safari 3.كان الحل الذي توصلت إليه هو نقل ViewState إلى أعلى النموذج (تم توسيع فئة الصفحة واستبدال طريقة Render لما قبل 3.5 SP1، أو .Net 3.5 SP1 وما بعده للقيام بذلك بشكل افتراضي)، وتقسيم ViewState إلى عدة حقول مختلفة بدلاً من ملف وحش واحد. يرى تقطيع ViewState في ASP.NET 2.0 (maxPageStateFieldLength)

هذه الأداة المجانية على الإنترنت: http://aspnetresources.com/tools/machineKey ينشئ عنصر MachineKey ضمن عنصر system.web في ملف web.config.فيما يلي مثال على ما يولده:

<machineKey validationKey="1619AB2FDEE6B943AD5D31DD68B7EBDAB32682A5891481D9403A6A55C4F91A340131CB4F4AD26A686DF5911A6C05CAC89307663656B62BE304EA66605156E9B5" decryptionKey="C9D165260E6A697B2993D45E05BD64386445DE01031B790A60F229F6A2656ECF" validation="SHA1" decryption="AES" />

بمجرد رؤية هذا في ملف web.config الخاص بك، يصبح الخطأ نفسه منطقيًا فجأة.يقول الخطأ الذي تحصل عليه

"تأكد من أن التكوين يحدد نفس خوارزمية التحقق من الصحة والتحقق".

عندما تنظر إلى عنصر MachineKey هذا، يمكنك فجأة رؤية ما يتحدث عنه.


من خلال "الترميز الثابت" لهذه القيمة في web.config، يظل المفتاح الذي يستخدمه asp.net لإجراء تسلسل وإلغاء تسلسل حالة العرض الخاصة بك كما هو، بغض النظر عن الخادم الموجود في مزرعة الخوادم الذي يلتقطه.يصبح التشفير الخاص بك "محمولاً"، وبالتالي تصبح حالة العرض الخاصة بك "محمولة".

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

"يتم إيقاف إعادة النشر قبل تحميل جميع حالات العرض"

لقد واجهت هذه المشكلة بالضبط من قبل، وكان هذا هو السبب.

في البداية قمنا بتعطيل خاصية ViewStateMac (enableViewStateMac="false" في ال page التوجيه) لحلها، ولكن هذا ليس حلاً حقيقياً للمشكلة ويمكن أن يهدد سلامة البيانات.لقد قمنا بحل المشكلة في النهاية عن طريق تعطيل زر الإرسال الخاص بنا حتى يتم تحميل الصفحة بالكامل، وتقليص حجم حالة العرض الخاصة بنا عن طريق تعطيله في بعض عناصر التحكم.

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

لقد قمت في الماضي بتجربة كل شيء (بما في ذلك الحل الذي اقترحه Jeffaxe أعلاه) ولكن بدون نتيجة، ولم أرغب في تعيينه enableViewStateMac="false" (كما ذكر Raelshark أعلاه) إلى صفحتي، لأن هذا يخفي المشكلة فقط.

ما سبب المشكلة في حالتي؟كانت المشكلة بسبب استخدام Intelligencia.UrlRewriter (الإصدار 2.0 RC 1 build 6) في صفحات معينة من موقع الويب الخاص بي.كنت أستخدم بعض الروابط الصديقة لكبار المسئولين الاقتصاديين (SEO) وكان ذلك يتسبب في فشل التحقق من صحة ViewState.عندما استخدمت الروابط "العادية" (بدلاً من الروابط الملائمة لتحسين محركات البحث) اختفت المشكلة!

لقد قمت بإعادة إنتاج المشكلة عدة مرات للتأكد من أنها ليست إنذارًا كاذبًا (أستخدم ASP.NET 3.5).

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

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

وفي JavaScript، قمت بإرسال النموذج (theForm.submit();)

أعتقد أنه في حالتي كانت مشكلة أمنية، وأنه لا يمكنك تغيير هذا بعد أن تم تعيينه بالفعل على الصفحة...؟

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

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