ASP.NET Ajax – асинхронный запрос имеет отдельный сеанс?

StackOverflow https://stackoverflow.com/questions/127842

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Наконец, что касается ваших требований...Использование 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.

Другие советы

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

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

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

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

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}

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

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top