Как изящно бороться с ошибками ViewState? - PullRequest
2 голосов
/ 16 сентября 2008

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

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

  Error: The state information is invalid for this page and might be corrupted.

  Target: Void ThrowError(System.Exception, System.String, System.String, Boolean)

  Data: System.Collections.ListDictionaryInternal

  Inner: System.Web.UI.ViewStateException: Invalid viewstate. Client IP: 66.35.180.246 Port: 1799 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008052906 Firefox/3.0 ViewState: (**Very long Gibberish Omitted!**)

  Offending URL: (**Omitted**)

  Source: System.Web

  Message: The state information is invalid for this page and might be corrupted.

  Stack trace: at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded() at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) at System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Ответы [ 5 ]

2 голосов
/ 16 сентября 2008

Это странно, поскольку ViewState хранится в виде строки на самой веб-странице. Поэтому я не вижу, как длительный период времени может вызвать эту ошибку. Возможно, один или несколько объектов на странице были собраны сборщиком мусора или сброшены приложением, поэтому представление состояния ссылается на старые элементы управления вместо элементов управления, созданных при перезапуске приложения.

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

1 голос
/ 16 сентября 2008

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

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

Проверка ViewState Provider - реализация, использующая шаблон проектирования модели поставщика для предоставления настраиваемого поставщика Viewstate.

0 голосов
/ 17 сентября 2008

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

Если вам нужна идея общей реализации обработчика глобальных ошибок, у меня есть один доступный на моем веб-сайте, я могу дать вам код при необходимости - http://iowacomputergurus.com/free-products/asp.net-global-error-handler.aspx

0 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

...