【问题标题】:SignalR JS Client Methods Not Invoked未调用 SignalR JS 客户端方法
【发布时间】:2012-12-13 21:05:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: signalr-hub


    【解决方案1】:

    所以,答案实际上很简单(尽管自上一个版本以来我已从 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!' );
        });
    

    【讨论】:

    • 太棒了!非常感谢!
    • 这是非常重要的提示!!你救了我很多天 :) 谢谢!
    • 感谢您今天节省了我的时间。
    • 谢谢,我在 angularjs 中尝试的顺序错误
    • 我在将 SignalR 版本升级到 2.2.1 时遇到了同样的问题,现在看来您必须在开始连接之前指定客户端操作/方法,而以前这无关紧要。
    【解决方案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。

    希望对您有所帮助。

    【讨论】:

    • 这在您的情况下起作用的原因是因为 $.extend 在调用 done 方法的回调之前完成。这会导致竞争条件,如果在 start() 调用和 $.extend 之间发生任何事件阻塞执行(可能发生),SignalR 将无法访问任何方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多