iOS Safari:经常发送的Ajax调用有时无法到达服务器

时间:2019-01-21 13:04:18

标签: ios ajax asp.net-mvc safari request

现在搜索了几个小时,很遗憾,我找不到当前iOS Safari问题的解决方案。

我有一个JavaScript前端,它使用jQuery.ajax与ASP.NET MVC Web服务器进行通信。

这在所有平台上都绝对完美,例如Windows 10配备Chrome,Firefox,IE(是,IE可以运行),Edge。或在装有Chrome,Firefox,Safari的Mac上。 起作用的地方是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的jQuery设置为false
  • 我为每个呼叫(以及POST)添加了类似Guid的参数,以确保URL始终是唯一的
  • 如上所述,我添加了可以解决问题的延迟,但实际上并不可行
  • 我试图在iOS模拟器中重现该问题。结果相同。
  • 这似乎仅影响POST请求,但我不确定。

我该如何解决?

0 个答案:

没有答案