2012-12-11 43 views
2

我遇到了SignalR的问题,至今无法理解为什么。 我已经写了一个长时间处理操作的中心,并注意到它会在FireFox中更新进度,但是Chrome有问题。 所以,我写了简单的测试中心,以检查是怎么回事:SignalR块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); 
    } 
} 

它做什么,它增加了进度每隔几秒钟。它在两个浏览器中都可以像在干净的项目中那样工作 - 每隔几秒钟在浏览器中显示新的进度消息。
但是,当我在真实项目上尝试它时,它可以正常工作,但在Chrome中,它看起来完全阻止UI(甚至不重绘Chrome控制台),只有当LongProcess完成时,它才会添加所有进度消息。
所以问题是,这可能是什么原因 - 可能是一些jQuery设置?任何想法要检查什么? 顺便说一句,我试过longPollingserverSendEvents(这是在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

你的客户代码是什么? –

+0

用客户端代码更新了问题。 – Giedrius

+0

在服务器上放置一个断点,当您通过Chrome启动连接时,确保您的服务器端方法触发。通常发生挂起不能实例化连接。 –

回答

2

找到了答案。
我们有在jQuery的远程验证使用这段代码(以避免比赛条件)夫妇地方:

$.ajaxSetup({ async : false }); 

所以,当我删除它,SignalR开始在Chrome工作的罚款。有趣的是,在FireFox上它没有任何影响 - 它可以使用或不使用这行代码。