Является ли SessionPageStatePersister правильным выбором? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть простое, заурядное приложение 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 потенциально может привести к потере данных, потому что независимо от .

...