【问题标题】:Cannot read property 'chatHub' of undefined SignalR Hub无法读取未定义 SignalR Hub 的属性“chatHub”
【发布时间】:2019-01-20 21:45:12
【问题描述】:

我正在尝试学习信号器,这个错误是我建立的。

无法读取未定义的属性“chatHub”。

$(document).ready(function () {
        var chat = $.connection.chatHub;
        $.connection.hub.start();
 });

集线器文件是:

namespace TestSignalR.Web.Hubs
{
public class ChatHub : Microsoft.AspNet.SignalR.Hub
{
    public void Send(string msg)
    {
        ChatData chat = new ChatData();
        chat.Msg = msg;
        chat.UserName = HttpContext.Current.User.Identity.Name;
        chat.Date = "♣ at " + DateTime.Now.ToString("hh:mm tt");
        Clients.All.broadCastMessage(chat);
    }
}
}

【问题讨论】:

  • 您能分享一下您是如何解决问题的吗?
  • 此问题通常是由于在“~/signalr/hubs”处对自动生成的 Hub JavaScript 代理的脚本引用丢失或无效。请确保在您的应用程序中的任何其他路由之前注册 Hub 路由。

标签: jquery asp.net-mvc signalr signalr-hub


【解决方案1】:

您文档的<HEAD> 中可能缺少这一行:

<script src="/signalr/hubs" type="text/javascript"></script>

检查你也有

 <script src="/Scripts/jquery.signalR-1.0.0.js"></script>

并使用 Fiddler 或 Chrome 开发者工具检查两个文件是否正在加载,以及 /hubs 文件是否包含您期望它包含的集线器定义。

【讨论】:

  • 添加了一些其他的回答建议
  • @YehiaElhawary:您介意分享一下解决问题的方法吗?
【解决方案2】:

由于 MVC 如何尝试提供帮助并呈现 jquery 包,我似乎总是遇到这个问题。然后,当您尝试在视图中添加信号器时,它将失败,因为您必须事先添加 jquery,但是 jquery 会被 MVC 包再次加载。这会混淆看起来的东西并导致错误。您可能会在主布局页面中包含此部分:

@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)

因此,如果您将脚本添加到脚本部分,它应该会让 Signalr 满意并且工作正常。

@section scripts {
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-2.0.2.min.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>
    <!--Add script to update the page and send messages.--> 
    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub. 
            var chat = $.connection.chatHub;
            // Create a function that the hub can call to broadcast messages.
            chat.client.broadcastMessage = function (name, message) {
                // Html encode display name and message. 
                var encodedName = $('<div />').text(name).html();
                var encodedMsg = $('<div />').text(message).html();
                // Add the message to the page. 
                $('#discussion').append('<li><strong>' + encodedName
                    + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
            };
            // Get the user name and store it to prepend to messages.
            $('#displayname').val(prompt('Enter your name:', ''));
            // Set initial focus to message input box.  
            $('#message').focus();
            // Start the connection.
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    // Call the Send method on the hub. 
                    chat.server.send($('#displayname').val(), $('#message').val());
                    // Clear text box and reset focus for next comment. 
                    $('#message').val('').focus();
                });
            });
        });
    </script>
}

【讨论】:

  • 你值得 +1。但是,不明白,为什么没有脚本部分 signalR 脚本不起作用?
【解决方案3】:

对于所有拥有正确 dll 但即使解决方案不起作用的人的解决方案是更改函数名称的大小写。

就像我的班级名称是TestAHub

但是改为testAHub。

其实你需要打开这个js“/signalr/hubs”来查看名字。

【讨论】:

  • 这让我很长时间,但是当我看到你的评论时,我记得文档提到你的集线器需要在 camalCase 中。谢谢。
【解决方案4】:

检查你有 app.MapSignalR();在您的 Startup.cs 文件上。在http://www.asp.net/signalr/overview/releases/upgrading-signalr-1x-projects-to-20 上查看更多信息。

【讨论】:

    【解决方案5】:

    我在使用 Firefox 时遇到了问题,就我而言,我使用的是 https,而在 dev 中它不存在,所以我收到了错误,因为 https 的异常没有注册。 只需访问信号器服务器并添加即可。

    【讨论】:

      【解决方案6】:

      尝试本教程后我遇到了同样的问题:https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

      我发现缺少一条指令:

      using System;
      using System.Threading.Tasks;
      using Microsoft.Owin;
      using Owin;
      
      [assembly: OwinStartup(typeof(signalChat.Startup))]
      
      namespace signalChat
      {
          public class Startup
          {
              public void Configuration(IAppBuilder app)
              {
                  app.MapSignalR(); // add this 
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多