中止/取消在IE中不起作用的AJAX请求

时间:2015-06-10 03:14:20

标签: javascript jquery ajax asp.net-mvc signalr

我有一个允许用户上传和下载文档的应用程序。在下载区域,用户可以选择多个文件(所有pdf),并执行合并和下载

大。

合并过程中会弹出一个模态窗口,显示合并的状态,并使用 SignalR 进度条。这适用于所有浏览器,并且下载发生。

问题:此模式上有取消合并和下载按钮。它会停止 SignalR 集线器,并向AJAX调用发送abort()请求。这适用于Safari,Chrome和FF - 但不适用于IE。

当我看到Fiddler时,Chrome会停止其中的服务器端方法。在IE中,它尝试将该请求发送到SignalR。 IE中的结果是模态窗口按预期消失,但几秒钟后您会收到文件已下载的提示(实际处理从未停止)。请注意下面Fiddler会话中调用abort的区别。

Fiddler(Chrome - 正常工作):

Chrome - working

Fiddler(IE - 无法正常工作):

IE - not working

使用Javascript:

$('#cancelDownloadMerge').on('click', function () {
    $.connection.hub.stop();
    XX.Documents.DocumentsView.download.abort();
    XX.Documents.DocumentsView.mergeCancelled = true;
    XX.Documents.DocumentsView._isMerging = false;
});

最初点击合并和下载时触发的AJAX调用是冗长且专有的,但cache: falsecrossDomain: true(因为当前运行的localhost)设置为但问题仍然存在。我不认为AJAX调用是如此相关,因为它与IE非常相似,但我可以尝试在需要时发布更多内容。

怀疑这与Chrome和FF正在使用 ServerSentEvents 这一事实有关,而IE正在使用 forever frame (SSE不是支持)。

我坚持这一点,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题是由于SignalR始终默认使用IE中的Forever Frame。添加以下限制迫使SignalR在IE中使用长轮询。

$.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] });