ASP.NET Ajax - Асинхронный запрос имеет отдельный сеанс? - PullRequest
5 голосов
/ 24 сентября 2008

Мы пишем поисковое приложение, которое сохраняет критерии поиска в состоянии сеанса и выполняет поиск внутри панели обновлений asp.net. Иногда, когда мы последовательно выполняем несколько поисков, второй или третий поиск иногда возвращает результаты из первого набора критериев поиска.

Пример: при первом поиске мы ищем «Джон Смит» -> отображаются результаты Джона Смита. При втором поиске мы ищем результаты «Боб Джонс» -> Джон Смит.

Мы сохраняем все критерии поиска в состоянии сеанса, как я уже сказал, и читаем его из состояния сеанса внутри запроса ajax для форматирования запроса БД. Когда мы ставим точки останова в VS, все ведет себя как обычно, но без них мы получаем исходные критерии поиска и результаты.

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

EDIT ::: Более подробно, было предложено добавить критерии поиска в строку запроса, что обычно является хорошей практикой, и я согласен, что так и должно быть, но, следуя нашим требованиям, я не считаю его жизнеспособным. Они хотят, чтобы пользователь заполнял поиск элементов управления вводом, и при этом перезагрузка страницы не выполнялась. Единственное, что он видит, - это индикатор прогресса на странице, и у них все еще есть возможность перемещаться и использовать другие функции на текущей странице. Если бы я добавил критерии в строку запроса, мне пришлось бы сделать еще один запрос, заставляющий загружать всю страницу, что в зависимости от критериев поиска может занять очень много времени. Вот почему мы используем вызов ajax для выполнения поиска и почему мы не вызываем еще один полный запрос страницы ..... Надеюсь, это прояснит ситуацию.

Ответы [ 4 ]

5 голосов
/ 24 сентября 2008

Просто еще одна мысль, я всегда сталкиваюсь с проблемами с updatepanel и предпочитаю писать свои атласы ajax-запросов напрямую через библиотеку, используя PageMethods. Вы имеете больше контроля над тем, что вы отправляете и получаете. UpdatePanel отправляет всю страницу и получает всю иерархию элементов управления страницей, затем анализирует то, что является «свежим», и отображает это.

Изменить: Какой код вы используете для сохранения критериев в сеансе? И есть ли у вас код в методе, который на самом деле проверяет, имеет ли сессия некоторые сохраненные критерии, и вместо этого передает его обратно? Может быть, поэтому 2-й / 3-й постбэки панели обновления возвращают первый набор критериев вместо ожидаемых результатов? Кроме того, я знаю, что, выполняя некоторые тяжелые атласы в ajax, определенно нет двух сессий (одна для обычной обратной передачи, другая для асинхронной). Есть ли шанс, что вы используете веб-ферму?

Правка № 2: Я бы не смог написать то, что написал выше (первый абзац), если бы не был поклонником того, кто тоже ответил: https://stackoverflow.com/users/60/dave-ward

4 голосов
/ 25 сентября 2008

Между обычными загрузками страниц ASP.NET, обратными передачами и частичными обратными передачами ASP.NET AJAX не существует нескольких сеансов. Я могу сказать вам это с уверенностью.

Вместо того, чтобы хранить строку поиска в сеансе, как насчет простого использования содержимого поиска TextBox напрямую? Я не могу придумать причину, по которой вам нужно было бы перетасовывать ее, так как она все равно будет доступна на протяжении всего жизненного цикла страницы.

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

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

Вы можете использовать пользовательский элемент управления для отображения результатов поиска через веб-сервис (намного быстрее, чем UpdatePanel): http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

Или вы можете вернуть результаты поиска в формате JSON и отобразить их на стороне клиента (даже быстрее): http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to-build-a-client-side-repeater/

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

4 голосов
/ 24 сентября 2008

Вам необходимо установить свойство EnableSession атрибута WebMethod для функции, которую вы вызываете.

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}
0 голосов
/ 27 мая 2010

Если вы используете универсальные обработчики .ashx, просто производные от интерфейса IRequiresSessionState

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...