очень большое веб-приложение с нарушением состояния просмотра - PullRequest
3 голосов
/ 26 августа 2010

У меня есть веб-приложение, которое использует веб-сервис. На главной странице выполняется поиск - путем передачи параметров определенному методу веб-службы, и я связываю результаты с видом сетки.

Я реализовал сортировку и разбиение на страницы в сетке. Поместив таблицу данных, к которой привязана сетка, в состояние просмотра, а затем прочитав / отсортировав / отфильтровав ее по мере необходимости - и повторно привязав к сетке.

Поскольку объем данных, возвращаемых из веб-службы, резко увеличился, при попытке выполнить постраничную сортировку / сортировку и т. Д. Я получаю следующие ошибки.

Соединение было сброшено

Соединение с сервером было сброшено во время загрузки страницы.

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

  1. Ограничить результаты
  2. Прикрепите данные в сеансе, а не в состоянии просмотра
  3. Что-то еще, о чем я не знаю

Раньше у меня была дата в сеансе, так как некоторые из этих данных должны были сохраняться от страницы к странице - (однако, не публиковались, поэтому viewstate не было опцией). Когда количество данных возросло и необходимость их сохранения была устранена, я использовал вместо этого viewstate. Думая, что это лучший вариант, чем сеанс, из-за объема данных, которые должен будет содержать сеанс, и количества пользователей, использующих приложение.

Похоже, что нет.

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

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

Ответы [ 2 ]

1 голос
/ 26 августа 2010

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

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

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

РЕДАКТИРОВАТЬ: На основе ваших комментариев:

  1. Вы не можете изменить веб-сервис
  2. Пользователь может манипулировать запросом путем фильтрации или сортировки
  3. Большой объем данных возвращается веб-службой
  4. Данные зависят от пользователя

Ну, я думаю, у вас есть идеальный случай для использования Session тогда. Это может облагать налогом сервер с большими объемами пользователей и данных, поэтому вам может потребоваться реализовать некоторую логику для очистки данных из Session и не ждать, пока они истекут (как на определенных целевых страницах, которые, как вы знаете, пользователь пойдет когда они будут завершены, очистите данные сеанса).

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

Вы также можете посмотреть на данные, возвращаемые веб-сервисом, и сохранить их в пользовательском объекте, который вы делаете как можно более «тонким». Если вы сохраняете DataSet или DataTable в своем Session, эти объекты имеют некоторые дополнительные издержки, которые вам, вероятно, не нужны, поэтому сохраняйте данные в виде массива некоторого пользовательского тонкого объекта и просто привязывайте к нему. Вам нужно будет отобразить результат из WS на ваш пользовательский объект, но это хороший вариант, когда вы сокращаете использование памяти.

Дайте мне знать, если что-то еще мне не хватает.

1 голос
/ 26 августа 2010

Я бы не помещал данные ни в состояние просмотра, ни в сеанс. Вместо этого сохраните минимальную информацию, чтобы повторно запросить набор данных у веб-службы и сохранить ее (в состоянии просмотра или сеанса или даже в URL). Затем позвоните в веб-службу, используя эти данные, и обработайте данные по каждому запросу. Если необходимо, попробуйте использовать некоторую форму кэширования (memCache) для повышения производительности.

...