После поиска в течение нескольких часов, к сожалению, я не могу найти решение моей текущей проблемы 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, то вызовы выглядят так:
Кажется, они занимают очень много времени, но, взглянув на сервер, они, очевидно, никогда не доходят до серверной части. Кроме того, ровно через 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-запросы, но я не уверен в этом.
Как я могу это исправить?