【问题标题】:Cannot read property 'client' of undefined using SignalR无法使用 SignalR 读取未定义的属性“客户端”
【发布时间】:2017-06-14 21:17:49
【问题描述】:

我整天都在为此工作,但没有运气。 我也尝试过(几乎)每一个 SO 问题,但我没有让它工作......

我正在使用非常简单的 SignalR 推送消息和单独的简单前端运行 web api,以显示此推送消息。 就我而言,推送消息的数量不断变化。

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>test app</title>

    <script src="scripts/jquery-2.1.4.js"></script>
    <script src="scripts/jquery.signalR-2.2.0.js"></script>

    <script src="/signalr/hubs"></script>
</head>
<body>
    <div id="testElm">TEST: </div>

    <script type="text/javascript">
        $(document).ready(function () {

            $.connection.hub.url = "http://localhost:55833/signalr";
            var hub = $.connection.displayHub;

            hub.client.pushMessage = function (response) {

                $('#testElm').text(response);
            };

            $.connection.hub.start();
        });
    </script>
</body>
</html>

我的中心类

public class DisplayHub : Hub
{
    public DisplayHub() : this(GlobalHost.ConnectionManager.GetHubContext<DisplayHub>().Clients) { }

    public DisplayHub(IHubConnectionContext<dynamic> clients)
    {
    }

    public void PushMessage(string message)
    {
        // generate random number and send it every 1s for testing

        Clients.All.pushMessage(randomNumber);
    }
}

当运行时

$.connection.hub.logging = true;

这是我得到的日志

2015-06-15 16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Auto detected cross domain url.
2015-06-15 16:44:15.314 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Negotiating with 'http://localhost:55833/signalr/negotiate?clientProtocol=1.5'.
2015-06-15 16:44:15.434 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport starting.
2015-06-15 16:44:15.435 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:55833/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=h7UAGOrF6RP8JUE%2F82K84E8NSZOd8jsuijsCQ2Jyh1jRi7zXmIpoVnIP9tjEjlcWvxihtZBNt6BYdaAW2jp574B5nXS%2BJFEW%2F%2BdixsiV0yu3YwaN5ERh6yhYtkvztQSQ&tid=5'.
2015-06-15 16:44:15.451 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Websocket opened.
2015-06-15 16:44:15.510 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport connected. Initiating start request.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000

我不断得到

Cannot read property 'client' of undefined
  • 检查“集线器”将显示集线器未定义...
  • 浏览到http://localhost:55833/signalr/hubs 我可以看到正在创建的服务器上的集线器。
  • 暂时合并 API 和前端,一切正常,但如果我将它们分开,我会遇到上述错误...
  • 使用 [HubName("displayHub")] 属性没有区别。
  • CORS 已根据上述日志正确设置

任何想法是什么导致了错误?有没有办法可以进一步调试 signalR 以了解发生了什么?

更新 1:

阅读 ASP.NET SignalR Hubs API 指南 - JavaScript on http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client 我已根据没有生成的代理段落将我的代码更改为:

var conn = $.hubConnection("http://localhost:55833/signalr");
var hubProxy = conn.createHubProxy('displayHub');

hubProxy.on('pushMessage', function (response) {
    $('#testElm').text(response);
});

conn.start();

它开始起作用了...有人可以解释为什么吗?

【问题讨论】:

    标签: asp.net-web-api signalr signalr-hub


    【解决方案1】:

    根据您的问题,我了解到您有 2 个不同的客户端和服务器应用程序,并且您正在使用 CORS。第一次尝试失败的原因是您没有使动态 SignalR 端点以服务器应用程序为目标。你应该改变这个:

    <script src="/signalr/hubs"></script>
    

    进入这个:

    <script src="http://localhost:55833/signalr/hubs"></script>
    

    原因是,端点动态生成代表集线器形状的 Javascript 代码,因此需要在集线器所在的应用程序上调用它,因此需要在服务器上调用。

    【讨论】:

    • 你的意思是客户端“signalr/hubs”需要定位服务器地址?您在文档中有任何链接吗?我稍后会试一试,然后告诉你。谢谢
    • 是的。我找不到明确的声明,但它非常隐含,并且对于动态端点的工作方式是有意义的。它使用反射来检查集线器并生成代理,因此它必须从正在运行的进程中访问集线器的定义。客户不知道该怎么做。
    【解决方案2】:

    如果您的信号器项目在运行时未加载,您也可能会收到此错误。例如它缺少一个程序集。 不需要完整的主机前缀,因此包含 /signalr/hubs 就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多