ASP.NET: невозможно проверить данные

В чем причина этого исключения в ASP.NET? Очевидно, что это исключение viewstate, но я не могу воспроизвести ошибку на странице, которая бросает исключение (простая форма TextBox с кнопкой и ссылками навигации).

FWIW, я не запускаю веб-ферму.

Exception

Сообщение об ошибке: невозможно проверить данных.

Источник ошибки: System.Web

Целевая задача ошибки: байт [] GetDecodedData (Byte [], Byte [], Int32, Int32, Int32 ByRef)

Почтовые данные

VIEWSTATE:

/wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ + CKsnB

EVENTVALIDATION:

/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)

~ Уильям Райли-Ланд

Ответ 1

Наиболее вероятная причина этой ошибки заключается в том, что после возврата остатка до того, как все нагрузки в представлении (пользователь нажимает кнопки остановки или назад), viewstate не сможет проверить и выбросить ошибку.

Другие потенциальные причины:

  • Репликация пула приложений между моментом создания представления и временем, когда пользователь отправляет его обратно на сервер (маловероятно).
  • Веб-ферма, где машиныKeys не синхронизированы (не ваша проблема).

Обновление: статья Microsoft по этому вопросу. В дополнение к вышесказанному они предлагают две другие потенциальные причины:

  • Модификация состояния представлений с помощью брандмауэров/антивирусного программного обеспечения.
  • Проводка с одной страницы aspx на другую.

Ответ 2

В .NET 3.5 SP1 свойство RenderAllHiddenFieldsAtTopOfForm было добавлено в конфигурацию PagesSection.

Web.config

<configuration>

    <system.web>

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

    </system.web>

</configuration>

Интересно, что значение по умолчанию это true. Итак, по сути, если вы используете .NET 3.5 SP1, то ViewState автоматически отображается в верхней части формы (до того, как остальная часть страницы будет загружена), тем самым устраняя ошибку ViewState, которую вы получаете.

Ответ 3

У меня возникла проблема с определенными версиями Safari 3. Мое решение состояло в том, чтобы переместить ViewState в начало формы (расширен класс страницы и перезаписал метод Render для pre-3.5 SP1 или .Net 3.5 SP1 и более поздние версии делают это по умолчанию) и разделять ViewState на несколько разных полей вместо одного файла монстра. См. Перемещение ViewState в ASP.NET 2.0 (maxPageStateFieldLength)

Ответ 4

Этот бесплатный онлайн-инструмент: http://aspnetresources.com/tools/machineKey создает элемент machineKey под элементом system.web в файле web.config. Вот пример того, что он генерирует:

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

Как только вы видите это в своем web.config, сама ошибка внезапно имеет смысл. Ошибка, которую вы получаете, говорит

"убедитесь, что в конфигурации указано то же самое validationKey и алгоритм проверки".

Когда вы смотрите на этот элемент machineKey, вдруг вы можете видеть, о чем идет речь.


Под "жестким кодированием" этого значения в вашем web.config ключ, используемый asp.net для сериализации и десериализации вашего состояния просмотра, остается неизменным, независимо от того, какой сервер в ферме серверов выбирает его. Ваше шифрование становится "портативным", поэтому ваше viewstate становится "портативным".

Я просто догадываюсь также, что, возможно, тот же самый сервер (не в ферме) имеет эту проблему, если по какой-либо причине он "забывает" ключ, который у него был, из-за reset на любом уровне, который вытирает его, Возможно, именно поэтому вы видите эту ошибку после периода простоя и пытаетесь использовать "устаревшую" страницу.

Ответ 5

"postback останавливается до того, как загрузится все содержимое viewstate"

У меня была эта точная проблема раньше, и это было причиной.

Изначально мы отключили свойство ViewStateMac (enableViewStateMac="false" в директиве page) для его решения, но это не является истинным решением проблемы и может угрожать целостности данных. Мы в конечном счете разрешили его отключить нашу кнопку отправки до тех пор, пока страница не будет полностью загружена и не обрезает размер нашего окна просмотра, отключив его на некоторых элементах управления.

Ответ 6

Я нашел корень этой проблемы на своем веб-сайте, и мне наконец удалось решить. Это не прямой ответ на ваш вопрос, но я хотел поделиться этой небольшой информацией.

В прошлом я пробовал все (включая решение, предложенное Jeffaxe, выше), но без результата, и я не хотел устанавливать enableViewStateMac="false" (как упоминает Raelshark выше) на мою страницу, потому что это просто скрывает проблема.

Что вызвало проблему в моем случае? Проблема была вызвана использованием модуля Intelligencia.UrlRewriter (версия 2.0 RC 1 build 6) на определенных страницах моего веб-сайта. Я использовал некоторые дружественные для SEO ссылки, и это вызывало отказ в проверке ViewState. Когда я использовал "нормальные" ссылки (вместо ссылок на SEO), проблема исчезла!

Я несколько раз воспроизвел проблему, чтобы убедиться, что это не ложный сигнал тревоги (я использую ASP.NET 3.5).

Я знаю, что некоторые из вас могут не использовать указанный выше модуль и все равно получить эту ошибку, что означает, что причиной является что-то другое. По крайней мере, обмен опытом может быть полезным для некоторых.

Ответ 7

Я получил эту ошибку, когда у меня была установка тега формы на моей странице без атрибута действия, а затем в коде, я изменил атрибут действия формы на "Action.aspx".

И в JavaScript я отправил форму (theForm.submit();)

Я думаю, что в моем случае это была проблема с безопасностью, и вы не можете изменить это после того, как она уже установлена ​​на странице...?

Ответ 8

Не уверен, что это помогло бы кому угодно, но мое решение было исключение machineKey в моем webconfig для того, чтобы мой файл cookie прошел.