Вы можете с небольшой хитростью перехватить только сериализацию состояния страницы, выведя из System.Web.Page и переопределив свойство PageStatePersister:
private PageStatePersister _pageStatePersister = null;
protected override PageStatePersister PageStatePersister
{
get { return _pageStatePersister ?? (_pageStatePersister = new PersistState(this)); }
}
Как только вы это сделаете, вы можетеполучить новый экземпляр из HiddenFieldPageStatePersister и оттуда использовать отражение, чтобы изменить реализацию персистентности:
class PersistState : HiddenFieldPageStatePersister, IStateFormatter
{
public PersistState(Page p) : base(p)
{
FieldInfo f = typeof(PageStatePersister).GetField("_stateFormatter", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField);
f.SetValue(this, this);
}
object IStateFormatter.Deserialize(string serializedState)
{
BinaryFormatter f = new BinaryFormatter();
using (GZipStream gz = new GZipStream(new MemoryStream(Convert.FromBase64String(serializedState)), CompressionMode.Decompress, false))
return f.Deserialize(gz);
}
string IStateFormatter.Serialize(object state)
{
BinaryFormatter f = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress, true))
f.Serialize(gz, state);
return Convert.ToBase64String(ms.ToArray());
}
}
}
BEWARE
Это пример только для исследовательских целей.Приведенный выше код является РИСКОМ БЕЗОПАСНОСТИ, так как он не подписывает и не шифрует полезную нагрузку и поэтому может быть легко взломан любым, кто попытается нанести вред вашему сайту.
Снова НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД без полного и полного понимания безопасности, криптографии и сериализации .Net.
</warning>
Реальная проблема, как и у другихсказал, это использование состояния страницы для начала.Самое простое решение для плохо написанного приложения ASP.NET, которое интенсивно использует состояние страницы, - это установить сервер состояний и использовать SessionPageStatePersister.