2009-06-02 4 views
25

У меня есть (потенциально) длительные вызовы ajax, которые я хотел бы прервать, если пользователь перейдет на другую страницу. Следующий код вызовы JQuery отмены всех незавершенных объектов XMLHttpRequest при навигации от страницы:Браузер ждет завершения вызова ajax даже после того, как был вызван прерывание (jQuery)

$.ajaxSetup({ 
    beforeSend: function(xhr) { 
     $(window).bind('beforeunload', function() { 
      xhr.abort(); 
     }); 
    } 
}); 

В тестовом случае, я заставить 10-секундную паузу на работу на стороне сервера вызывается. Используя Firebug, я подтвердил, что приведенный выше код действительно заставит все ожидающие вызовы ajax останавливаться немедленно, когда я нажимаю любую ссылку на странице. Тем не менее, браузер все еще ждет 10 секунд, прежде чем перейти к следующей странице. Похоже, что IE проявляет такое же поведение. Это известное поведение браузера? Есть ли что-нибудь, что я могу сделать, чтобы позволить пользователю мгновенно перейти от страницы в этой ситуации? Заранее спасибо.

+0

Как выглядит вызов Ajax? – epascarello

ответ

27

Спасибо за ваши ответы! Оказывается, я совершенно ошибался в том, что это проблема с браузером - проблема была на сервере. ASP.NET выполняет сериализацию запросов того же сеанса, которые требуют состояния сеанса, поэтому в этом случае следующая страница не начинала обрабатывать на сервере до тех пор, пока эти запросы, инициированные ajax, не будут завершены.

К сожалению, в этом случае в обработчике HTTP, отвечающем на вызовы ajax, требуется состояние сеанса. Но доступ только для чтения достаточно хорош, поэтому, отмечая обработчик IReadOnlySessionState вместо IRequiresSessionState, блокировки сеансов не сохраняются и проблема исправлена.

Надеюсь, эта информация окажется полезной для других.

+2

У меня была такая головная боль с этим, спасибо большое! – Pablo

+0

У вас есть ссылки, которые объясняют это более подробно? – Phil

+0

@Phil, я нашел дополнительную информацию об этой проблеме с ASP.NET здесь: http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ –

2

Вы уверены, что используете асинхронный запрос? Если браузер блокирует в течение всего запроса, вы используете синхронный запрос (параметр асинхронной ложна)

+0

Сервер фактически останавливает навигацию, потому что страница, на которую он хочет перейти, использует тот же сеанс, что и запрос AJAX, который выполняется и удерживается на сеансе. – grantwparks

3

Вы можете проверить странный побочный эффект прерывания()

Когда метод прерывания() , событие readystatechange запускается в Explorer и Mozilla. Хуже, readyState = 4, что означает, что средний скрипт xmlhttp предполагает, что данные загружены правильно. Это может привести к очень странным последствиям.

описываемая здесь:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

1

Проблема с сервером также относится к серверу Apache/Php, с которым я работаю. Удаленный session_start на скрипте, который ему не нужен (AJAX), и все работает как ожидалось. Благодаря Тодду, который указал на подобную проблему!

9

Что касается собственного ответа Тодда на этот вопрос ...

Я просто имел этот вопрос с PHP и то же решение работало бы. Однако мне нужна была информация на сессии. Для разработчиков PHP вы можете позвонить session_write_close(), чтобы закрыть и выписать сеанс посередине запроса. Это освободит сеанс для других запросов.

+1

Большое спасибо. Я даже не знал о том, что сеанс, который хранится сервером для получения конкрементного запроса, до сих пор не упоминает session_write_close(). Это не все имеет смысл. –

+1

Сохранено в день .. Спасибо, приятель ... –

+0

@acdameli мне следует вызвать session_write_close() в моих функциях, вызывающих проблему или вызвав позже. –

0

Ссылка на принятый ответ:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/

О IRequiresSessionState

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

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Rajesh