我在使用 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());
});