iOS Safari: часто отправляемые ajax-звонки, иногда не доходящие до сервера - PullRequest
0 голосов
/ 21 января 2019

После поиска в течение нескольких часов, к сожалению, я не могу найти решение моей текущей проблемы iOS Safari.

У меня есть JavaScript-интерфейс, который использует jQuery.ajax для связи с веб-сервером ASP.NET MVC.

Это прекрасно работает на всех платформах, например Windows 10 с Chrome, Firefox, IE (да, IE работает), Edge. Или на Mac с Chrome, Firefox, Safari. Место, где он не работает, - iOS Safari.

В моем сценарии я отправляю несколько запросов AJAX на сервер почти одновременно. Возможно от 3 до максимум 6 звонков. Если посмотреть на инструменты разработчика Safari, то вызовы выглядят так:

DeveloperTools

Кажется, они занимают очень много времени, но, взглянув на сервер, они, очевидно, никогда не доходят до серверной части. Кроме того, ровно через 10 минут браузер запускает таймаут. Даже если я настроил тайм-аут AJAX на 60 секунд.

На данный момент мой код выглядит довольно хорошо (написано на TypeScript):

let defer: JQueryDeferred<any> = jQuery.Deferred();
this._RunningRequests++;

let settings: JQueryAjaxSettings = {
    method: method,
    url: this.BuildURL(controller, action, id),
    contentType: 'application/json',
    timeout: Timeout,
    cache: false,
    headers: {}
};

if (payload) {
    settings.data = JSON.stringify(payload);
}

jQuery.ajax(settings)
    .done((result: any) => {
        if (this.DetectLogoutRedirect(result)) {
            defer.reject();
            location.reload(true);
            return;
        }

        defer.resolve(result);
    })
    .fail((jqXHR: JQueryXHR, textStatus: string, errorThrown: string) => {
        defer.reject();
        this.HandleError(method, controller, action, jqXHR, textStatus, errorThrown);
    }).always(() => {
        this._RunningRequests--;
    });

return defer.promise();

Вот теперь самое интересное. Как только я добавлю задержку к звонку ...

let delay = this._RunningRequests * 500;
setTimeout(() => { jQuery.ajax(...) }, delay);

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

Вещи, которые я пробовал и выяснил до сих пор:

  • Я установил все заголовки для управления кешем, а также все конфигурации jQuery, для которых кеш имеет значение false
  • Я добавил параметр, похожий на guid, к каждому вызову (также POST), чтобы гарантировать, что URL всегда уникален
  • Как упомянуто выше, я добавил задержку, которая решает проблему, но на самом деле не практична
  • Я пытался воспроизвести проблему с помощью симулятора iOS. Тот же результат.
  • Кажется, это влияет только на POST-запросы, но я не уверен в этом.

Как я могу это исправить?

...