Должен ли я игнорировать случайную ошибку Invalid viewstate? - PullRequest
56 голосов
/ 23 февраля 2009

Время от времени (раз в день или около того) мы видим следующие типы ошибок в наших журналах для приложения ASP.NET 3.5

  • Неверное состояние просмотра
  • Неверный аргумент обратной передачи или обратного вызова

Это то, что время от времени "просто происходит" с приложением ASP.NET? Кто-нибудь посоветует, что мы потратим много времени, пытаясь выяснить причину проблемы?

Ответы [ 10 ]

49 голосов
/ 23 февраля 2009

Ну, это зависит. Неверное состояние просмотра может произойти по разным причинам.

  1. Viewstate слишком велик и не завершил рендеринг, пока пользователь не вызвал обратную передачу на странице. Как правило, исправление заключается в том, чтобы отключить все элементы управления, которые запускают обратные передачи, и включить их на стороне клиента после завершения загрузки страницы - см. http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx
  2. Вы используете MAC представления состояния (и так должно быть по соображениям безопасности), но вы не задали ключ компьютера, и пул приложений был переработан, генерируя новый. Не забудьте установить ViewStateUserKey.
  3. Кто-то использует старую версию IE на Mac, где он обрезает скрытые поля формы. В этом случае вам нужно переместить состояние просмотра со страницы в состояние сеанса .
  4. Проблемы с MAC в Viewstate обычно указывают на то, что вы находитесь в веб-ферме и забыли установить ключ компьютера в файле web.config. Однако, если вы сделали это, то, вероятно, кто-то пытается делать плохие вещи (боты публикуют комментарии, кто-то пытается инициировать события для отключенных элементов управления и т. Д.). Причину этого следует отследить, если только исключить потенциальные проблемы безопасности.

Что бы вы ни делали не отключите проверку состояния или проверку события.

7 голосов
/ 23 февраля 2009

Одна проблема может быть связана с усечением полей формы маршрутизаторами пользователей. Обойти это можно, установив для MaxPageStateFieldLength небольшое значение (например, 100) в файле web.config, и ViewState разбивается на маленькие куски. Это очень просто сделать, и эта статья объясняет это полностью.

4 голосов
/ 19 августа 2009

BlowDart имеет правильный ответ для проблемы Invalid Viewstate. Вероятно, ваш пул приложений перерабатывается и изменяет ключ шифрования.

Смотрите эти сообщения для поддержки:

Неправильная ошибка Viewstate в приложении .NET

Обеспечение постоянного входа пользователя в систему с членством ASP .Net

4 голосов
/ 23 февраля 2009

Исключения не "просто случаются" время от времени. Они всегда происходят по уважительным причинам, некоторые из которых уже перечислены в других ответах.

Однако, чтобы облегчить проблемы с ViewState, рассмотрите возможность его полного отключения. Как разработчики ASP.NET мы часто склонны использовать ViewState во всех местах, где он не нужен, потому что он используется по умолчанию. Я обычно думаю об использовании статического HTML, прежде чем рассмотреть возможность использования элемента управления. Если вы решили использовать элемент управления, подумайте, действительно ли ему нужно включить ViewState. Отключение этого часто приводит к лучшему времени загрузки страницы, поэтому, если вы можете, сделайте это.

Я бы хотел, чтобы он был отключен по умолчанию, чтобы люди были вынуждены так думать, но это не так.

Обновление для ответа на комментарий:

В верхней части головы у меня есть 3 возможности отключить ViewState.

  1. Отключить ViewState, если данные загружаются при каждой обратной передаче. Это часто бывает, если вы создаете сайты с поддержкой AJAX (это real AJAX, а не UpdatePanel;)), где вы обычно загружаете данные при первой загрузке, а затем перезагружаете / обновляете данные с использованием запросов AJAX. , В некоторых случаях вы можете даже загружать данные при каждом посещении с единственной целью отключить ViewState, а затем вместо этого кэшировать данные на сервере.

  2. Вы также можете отключить ViewState, если вы привязываете данные к содержимому, которое действительно статично. Иногда я нахожу список, который привязан к небольшой статической таблице basedata в базе данных или что-то в этом роде. Теперь, это может быть опасно, но если я убежден, что данные не изменятся, я мог бы переместить данные на страницу в виде статического содержимого (вы можете поместить его в отдельный элемент управления, чтобы у вас не было нескольких статических копий данных ). Но если данные затем изменятся, вам придется изменить их вручную.

  3. Простые элементы управления, такие как Labels, часто являются хорошими кандидатами для отключения ViewState.

Наконец, вы можете переключиться на ASP.NET MVC framework и навсегда распрощаться с этими проблемами, это то, что я планирую сделать, даже если у меня возникнут другие проблемы. ;)

2 голосов
/ 03 июля 2017

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

void Application_Error(object sender, EventArgs e)
    {          
                if (ex is HttpException && ex.InnerException is ViewStateException)
                {
                    Response.Redirect(Request.Url.AbsoluteUri);
                    return;
                }
    }

для получения дополнительной информации проверьте следующую ссылку:

https://www.karpach.com/viewstateexception-invalid-viewstate.htm

1 голос
/ 04 декабря 2013

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

База кода, над которой я работаю, имеет некоторый причудливый код, чтобы избежать двойных щелчков, и как часть этого он добавляет некоторые вещи в javascript каждого события нажатия кнопки, который отключает кнопку после первого нажатия, а затем выполняет обычный постбэк. Но вызов обратного вызова подобным образом был проблемой, потому что некоторые из моих кнопок уже имели обратный вызов, сгенерированный автоматически .NET. Так что я получил двойные постбэки, один из которых имел недопустимый ViewState. Удаление дополнительной обратной передачи остановило исключения для меня.

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

1 голос
/ 23 февраля 2009

Вы ничего не можете сделать с первым - я перехватываю такие исключения и отсылаю пользователя на страницу ошибки с сообщением в виде строки «Страница, на которой вы были, истекла. страница, на которой вы уже ввели данные. "

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

Опять же, вы ничего не можете с ними поделать, кроме как показать подходящее дружеское сообщение на своей странице ошибки.

0 голосов
/ 09 апреля 2010

Обновление: Microsoft объявила, что следующее исправление для IE 8 решает эту проблему:
http://blogs.msdn.com/ieinternals/archive/2010/04/01/IE8-Lookahead-Downloader-Fixed.aspx

0 голосов
/ 29 августа 2009

По словам Уэйна Уолтера Берри из этого блога, другой преступник может использовать XHTML-тип документа в IE8 без разметки, совместимой с XHTML на странице. Это может привести к тому, что IE8 отправит зашифрованные параметры в scriptresource.axd и выдаст недопустимое исключение состояния представления.

Он рекомендует убедиться, что все блоки javascript заключены в // <![CDATA[]]> или просто изменить тип документа (что может вызвать другие проблемы с CSS / стилем на вашей странице).

0 голосов
/ 07 августа 2009

Вероятно, не стоит игнорировать эту ошибку. В дополнение ко всем приведенным выше ответам вы можете рассмотреть вопрос о том, насколько велико ваше состояние просмотра. Большое представление может быть обрезано прокси-сервером.

Если ваше состояние просмотра большое, то было бы неплохо использовать трассировку ASP.net, чтобы увидеть, какие элементы управления используют viewstate и где вы можете отключить это.

...