我有一个允许用户上传和下载文档的应用程序。在下载区域,用户可以选择多个文件(所有pdf),并执行合并和下载。
大。
在合并过程中会弹出一个模态窗口,显示合并的状态,并使用 SignalR 进度条。这适用于所有浏览器,并且下载发生。
问题:此模式上有取消合并和下载按钮。它会停止 SignalR 集线器,并向AJAX调用发送abort()
请求。这适用于Safari,Chrome和FF - 但不适用于IE。
当我看到Fiddler时,Chrome会停止其中的服务器端方法。在IE中,它尝试将该请求发送到SignalR。 IE中的结果是模态窗口按预期消失,但几秒钟后您会收到文件已下载的提示(实际处理从未停止)。请注意下面Fiddler会话中调用abort的区别。
Fiddler(Chrome - 正常工作):
Fiddler(IE - 无法正常工作):
使用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: false
和crossDomain: true
(因为当前运行的localhost)设置为但问题仍然存在。我不认为AJAX调用是如此相关,因为它与IE非常相似,但我可以尝试在需要时发布更多内容。
我怀疑这与Chrome和FF正在使用 ServerSentEvents 这一事实有关,而IE正在使用 forever frame (SSE不是支持)。
我坚持这一点,非常感谢任何帮助。
答案 0 :(得分:0)
问题是由于SignalR始终默认使用IE中的Forever Frame。添加以下限制迫使SignalR在IE中使用长轮询。
$.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] });