我遇到SignalR的问题,到目前为止还无法理解原因。 我已经为长期订单处理操作编写了一个集线器,并注意到它在FireFox中更新了进度,但是Chrome有问题。 所以,我已经编写了一个简单的测试中心来检查发生了什么:
public class SimpleHub: Hub
{
public void LongProcess()
{
System.Threading.Thread.Sleep(2000);
Clients.Caller.AddProgress("Step 1 of 5 has completed.");
System.Threading.Thread.Sleep(2000);
Clients.Caller.AddProgress("Step 2 of 5 has completed.");
System.Threading.Thread.Sleep(3000);
Clients.Caller.AddProgress("Step 3 of 5 has completed.");
System.Threading.Thread.Sleep(1000);
Clients.Caller.AddProgress("Step 4 of 5 has completed.");
System.Threading.Thread.Sleep(4000);
Clients.Caller.AddProgress("Step 5 of 5 has completed.", true);
}
}
它做什么,它每隔几秒就会增加进度。它可以在两个浏览器中的干净项目中运行 - 每隔几秒钟在浏览器中显示新的进度消息
但是当我在真实项目上尝试它时,使用Firefox它可以正常工作,但在Chrome中看起来它完全阻止了UI(甚至不会重新绘制Chrome控制台),只有当LongProcess完成时,它才会添加所有进度消息。 />
所以问题是,这可能是什么原因 - 可能是一些jQuery设置?任何想法要检查什么?
顺便说一句,我已经尝试了longPolling
和serverSendEvents
(这是Chrome中的signalR自动选择的),两者都有相同的结果。
更新:添加了客户端代码:
var hub = $.connection.SimpleHub;
hub.client.AddProgress = function (progress) {
$("#placeOrderProgress").append('<li><span>' + progress + '</span><i></i></li>');
};
$.connection.hub
.start()
.done(function () {
hub.server.longProcess($('#checkoutForm').toJSON());
});
答案 0 :(得分:2)
找到答案。
我们曾在几个地方使用jQuery远程验证这段代码(以避免竞争条件):
$.ajaxSetup({ async : false });
因此,当我删除它时,SignalR在Chrome上开始正常工作。有趣的是,在FireFox上它没有任何影响 - 它可以使用或不使用这行代码。