ViewState недействителен только в Safari

Один из поддерживаемых мной сайтов сильно зависит от использования ViewState (это не мой код). Однако на некоторых страницах с ViewState чрезмерным раздутием Safari выдает "Validation of viewstate MAC failed" ошибку.

Похоже, это происходит только в Safari. Firefox, IE и Opera успешно загружаются по одному и тому же сценарию.

Ответов (3)

Решение

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

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

http://channel9.msdn.com/forums/TechOff/250549-ASPNET-ViewState-flawed-architecture/?CommentID=270477#263702

Кажется, это лучшее решение?

Пока я являюсь вторым по счету решением Channel 9, также имейте в виду, что в некоторых размещенных средах Safari не считается браузером верхнего уровня. Возможно, вам потребуется добавить его в браузерную оболочку вашего приложения, чтобы использовать некоторые функции ASP.Net.

Это было основной причиной некоторых головных болей, которые у нас были для сайта клиента, который использовал элемент управления ASP Menu.

Моим первым портом захода было бы просмотреть элементы на странице и посмотреть, какие элементы управления:

  1. Будет по-прежнему работать, когда я выключу ViewState
  2. Может быть перемещен со страницы в вызов AJAX для загрузки при необходимости

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

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