6

我无法让 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);
        ...
    });

如上所述,我找不到任何明显的设置缺陷,但这里有一些可能相关的点:

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

那么,鉴于上述情况,我是否遗漏了一些明显的东西?如果不是,那么识别故障点的最佳方法是什么?

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

4

2 回答 2

36

所以,答案实际上很简单(尽管自上一个版本以来我已经从 1.0.0.0-rc1 升级到 1.0.0.0 - 但我相当肯定这并没有显着改变这种情况)。

我在这里找到了答案: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!' );
    });
于 2013-02-27T17:31:47.463 回答
-2

当您将鼠标悬停在 Clients 对象上时,您是否看到您在 JS 中定义的所有函数?

无论如何,我不确定为什么你的方式行不通,但这就是我编写客户端的方式,并且它有效。也许你可以试试这个方法。

$(function () {

    var hub = $.connection.RatesHub;


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

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

}

您想在服务器中识别的任何功能,请使用 $.extend。

希望有帮助。

于 2012-12-31T11:00:22.423 回答