2010-06-30 4 views
0

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

После удаления этих данных VIEWSTATE является прекрасным и может быть десериализован (как подтверждено View State Decoder 2, который является довольно крутой программой).

Итак, что я хочу сделать, это

  1. улова ошибка, которая возникает
  2. Проверьте VIEWSTATE этой проблемы
  3. изменить ViewState (удалить! S)
  4. попытки снова проанализировать VIEWSTATE

Я работаю над попыткой переопределить LoadPageStateFromPersistenceMedium в System.Web.UI.Page и магия работы оттуда. Все еще работаю над этим ...

+2

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

+0

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

ответ

0

Попробуйте следующие методы: SavePageStateToPersistenceMedium и LoadPageStateFromPersistenceMedium, которые вы можете переопределить на своей странице. Там вы можете перехватить VIEWSTATE, который отображается на странице, или происходит из скрытого поля на странице.

Cheers!

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

protected override object LoadPageStateFromPersistenceMedium() 
    { 
     string vsString = Request.Form["__COMPRESSEDVIEWSTATE"]; 
     byte[] bytes = Convert.FromBase64String(vsString); 
     bytes = Compression.Decompress(bytes); 
     return formatter.Deserialize(Convert.ToBase64String(bytes)); 
    } 
Смежные вопросы