отменить асинхронную обратную передачу с длительным процессом на сервере - PullRequest
4 голосов
/ 15 января 2011

У меня проблемы с отменой обратной передачи в асинхронном режиме.У меня есть панель обновления с прогрессом обновления, которая содержит кнопку отмены, чтобы пользователь мог отменить обратную передачу.Когда пользователь нажимает кнопку для создания отчета, отображается ход обновления.Отчет может занять некоторое время, поскольку он должен перебирать тысячу или около того раз, создавая таблицу Excel.Если пользователь решает отменить запуск отчета по какой-либо причине, он может нажать кнопку отмены, которую я затем вызываю abortPostBack () в javascript, который останавливает процесс обновления, и страница отображается снова.Однако пользователь не может делать что-либо еще, например переходить на другую страницу, поскольку сервер все еще обрабатывает цикл.Как бы остановить цикл обработки на сервере, когда пользователь нажал кнопку отмены?Любая помощь приветствуется!

Ответы [ 3 ]

1 голос
/ 15 января 2011

Вы говорите, что простая HTTP-ссылка недоступна на стороне клиента, пока не завершится асинхронная обратная передача? Если это так, это звучит как загадка, поскольку вам нужно либо оптимизировать процесс на стороне сервера, либо установить меньшее время ожидания запроса на стороне сервера. Либо так, либо измените дизайн вашего взаимодействия с пользователем, чтобы процесс генерации Excel на стороне сервера выполнялся асинхронно, а не синхронно, чтобы пользователю не приходилось ждать завершения генерации Excel. Вы можете придумать это на стороне клиента, чтобы затем установить таймер JavaScript для периодического запроса к серверу, чтобы увидеть, готов ли файл, и, если это так, указать это пользователю с помощью и дать им ссылку для загрузки файла или что-то в этом роде.

В противном случае, если вы могли бы вызвать другой AJAX-запрос во время ожидания его возврата (что может не произойти из-за его звука), вы могли бы просто выполнить новый HTTP-запрос, который «отменяет» длительный процесс. Но похоже, что это не сработает, поскольку сервер все еще обрабатывает длительный HTTP-запрос. Так что я бы предпочел изучить варианты в моем первом абзаце.

Если отмена действительно позволила выполнить асинхронный HTTP-запрос на стороне клиента, тогда вы можете установить значение состояния сеанса, чтобы указать, что была отменена просьба об отмене. Лично я бы к этому не подходил. Но если вы это сделаете, то ваш длительный процесс на стороне сервера может периодически искать наличие значения сеанса. Скажи:

if (Session["cancel-me"] != null) 
{
    Session["cancel-me"] = null;
    abortThisLongProcess();
}
0 голосов
/ 31 января 2012

Я не нашел способа отменить запущенный запрос, но нет реальной причины, по которой вы не можете начать новый.

По умолчанию ASP.Net пытается (это не всегда) применять эксклюзивную блокировку к объекту сеанса - как только одна страница читает его, каждый другой запрос страницы, который передает тот же идентификатор сеанса (по cookie или по URL-адресу) ) должен ждать первой страницы, чтобы освободить сеанс.

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

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

0 голосов
/ 17 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...