У меня есть простое, заурядное приложение ASP.NET для веб-форм. Он развернут на собственном экземпляре AWS с большим количеством оперативной памяти и редко, если вообще когда-либо, имеет более десятка одновременно работающих пользователей. Все страницы в основном состоят из больших видов сетки и форм, все с использованием ViewState. Страницы занимают около 1,5 МБ каждая, поэтому для пользователей с медленным интернетом загрузка на обратную передачу занимает некоторое время, что делает приложение неудобным для использования.
Я искал способы уменьшить размер страницы, не перестраивая все это в MVC. Сначала я попытался сжать ViewState следующим образом: Страница CodeProject показывает:
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = Request.Form["__VSTATE"];
byte[] bytes = System.Convert.FromBase64String(viewState);
bytes = Compressor.Decompress(bytes);
var formatter = new System.Web.UI.LosFormatter();
return formatter.Deserialize(System.Convert.ToBase64String(bytes));
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
var formatter = new System.Web.UI.LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateString = writer.ToString();
byte[] bytes = System.Convert.FromBase64String(viewStateString);
bytes = Compressor.Compress(bytes);
ClientScript.RegisterHiddenField("__VSTATE",
System.Convert.ToBase64String(bytes));
}
Уменьшен размер страницы с 1,5 МБ до 680 КБ. Довольно хорошо, так мало усилий. Затем я узнал о SessionPageStatePersister и использовал его как этот ответ показывает:
PageStatePersister pageStatePersister;
protected override PageStatePersister PageStatePersister
{
get
{
return pageStatePersister ??
(pageStatePersister = new SessionPageStatePersister(this));
}
}
С учетом этого размер страницы увеличивается с 1,5 МБ до 450 КБ. Довольно хорошо тоже! Я понимаю, что это использует больше памяти на сервере, но, учитывая, что у меня редко бывает более десяти пользователей, в среднем 2-3, я не вижу в этом проблемы в ближайшее время. На этом этапе использование решения SessionPageStatePersister звучит достаточно хорошо. Я протестировал наиболее часто используемые страницы и не вижу проблем. И вот мой вопрос:
Я что-то упускаю, потенциальная проблема или лучшее решение в отношении Viewstate / Sessionstate?
Я знаю, что мог бы просмотреть каждую страницу и оптимизировать их, или разработать собственный PageStatePersister, и регулярно выполнять оптимизацию веб-страниц. По этому вопросу меня не интересуют такие решения. Я хочу услышать, например, что использование SessionPageStatePersister потенциально может привести к потере данных, потому что независимо от .