0

Следует ли игнорировать периодическую ошибку Invalid viewstate?

1

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

  • Неверное состояние представления (Invalid viewstate)
  • Неверный аргумент постбека или коллбека (Invalid postback or callback argument)

Это нормально для ASP.NET приложений, что такие ошибки возникают время от времени? Стоит ли нам уделять много времени диагностике причин этих проблем, или это что-то, что "просто случается"?

5 ответ(ов)

0

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

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

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

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

Сразу на ум приходят три случая, когда можно отключить ViewState.

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

  2. Рассмотрите возможность отключения ViewState, если вы связываете данные с содержимым, которое действительно статично. Иногда бывают списки, связанные с небольшой статической таблицей в базе данных. Это может быть рискованно, но если я уверен, что данные не изменятся, я могу переместить их на страницу как статическое содержимое (вы можете обернуть их в отдельный контрол, чтобы у вас не было нескольких статических копий данных). Однако если данные изменятся, вам придется обновлять их вручную.

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

В заключение, вы можете переключиться на фреймворк ASP.NET MVC и навсегда забыть об этих проблемах. Это то, что я планирую сделать, даже если это приведет к появлению других проблем. 😉

0

Вопрос: Почему я получаю ошибку "invalid view state", и как ее исправить?

Ответ: Ошибка "invalid view state" не имеет никакого значения для вашего логгирования, пользователей или вашего сайта. Конечные пользователи никогда не видят эти ошибки. Чтобы избежать этой ошибки, вы можете добавить следующий код в файл Global.asax:

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

Этот код помогает перенаправить пользователей на текущую страницу, если возникает ошибка ViewState.

Для получения дополнительной информации посмотрите по следующей ссылке:
https://www.karpach.com/viewstateexception-invalid-viewstate.htm

0

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

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

Снова, с этими ситуациями мало что можно сделать, кроме как показать на странице ошибки соответствующее дружелюбное сообщение.

0

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

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

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

0

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь