2012-12-28 99 views
5

我无法获取SignalR服务器端中心代码来调用JS客户端方法。反过来工作正常 - 所以当我的客户端发送消息到服务器时,它按预期发送。我一直很小心避免出现明显的陷阱,但我想我仍然可以忽略一些东西。这里是我的代码:未调用SignalR JS客户端方法

从MessageHub.cs:

public bool SendMessage(ClientMessage message) 
{ 
    ... 
    Clients.All.addMessage("my message"); 
    ... 
} 

的Javascript:

$.connection.hub.start() 
    .done(function() { 
     messageHub = $.connection.message; 

     // addMessage is never invoked. 
     messageHub.client.addMessage = function (message) { 
      alert('message added'); 
     }; 

     /* // I tried this based on some sample code but still not invoked. 
     messageHub.addMessage = function (message) { 
      alert('message added'); 
     }; 
     */ 

     // This works as expected. 
     messageHub.server.registerUser(userId); 
     ... 
    }); 

正如上面提到的,我无法找到设置,但这里的任何明显的缺陷有几个可能相关的要点:

  • 建立连接并调用服务器端方法。
  • 这可能是不相关的,但我试过强迫不同的运输行为没有改变。
  • 客户端方法名称在任何时候都不与服务器方法名称冲突。
  • 我也尝试将消息发送到特定的客户端连接(在这种情况下实际上是目标)。
  • 我在客户端和服务器上都启用了日志记录,但在任何情况下都没有看到任何相关内容。

因此,鉴于上述情况,我失去了一些东西明显?如果不是,确定故障点的最佳方法是什么?

P.S.这与问题没有特别的关系,但由于某种原因,Fiddler不再捕获任何浏览器的任何流量,这使得调试WS或HTTP流量有点具有挑战性 - 我猜这是Windows 8的事情。 。

回答

29

所以,答案其实很简单(虽然自上次发布我从1.0.0.0-RC1升级到1.0.0.0 - 但我相当肯定,没有signficantly改变这种情况)。

我找到了答案在这里:https://stackoverflow.com/a/15074002/32935(注意,特别是,我的解决办法是提供的第一个答案 - 尽管第二帮我找出原因)。

本质,对于那些谁不想去到原来的答案,我呼吁对连接start()一种方法,在done()回调反对,因为我在做之前必须设置我的客户的方法。这里有一个例子:

$.connection.message.client.addMessage = function (message) { 
    alert('Now it works!'); 
}; 

$.connection.hub.start() 
    .done(function() { 
     console.log('Connection established!'); 
    }); 
+0

你完全保存了我的一天,¡ – vfportero

+0

太棒了!非常感谢! – Oleg

+0

这是非常重要的提示!你救了我几天:)谢谢! –

-2

当你将鼠标悬停在客户对象,你看你在JS中定义的所有功能?

,无论如何,我不知道为什么你的方式不起作用,但是这是我怎么写我的客户端,和它的作品。也许你可以试试这种方式。

$(function() { 

    var hub = $.connection.RatesHub; 


    $.connection.hub.start().done(function() { 
     /*Logic goes here*/ 
    }); 

    $.extend(hub.client, { 
     FuncName: function (msg) { 
      /*Logic goes here*/ 
     } 
    }); 

} 

你想在你的服务器被识别的任何功能,使用$ .extend。

希望有所帮助。

+0

这种情况在你的情况下起作用的原因是因为$ .extend在完成方法的回调被调用之前完成。这导致了竞争条件,即如果在start()调用和$ .extend(可能发生)之间发生阻塞执行的任何事件,SignalR就无法访问任何方法。 –