无法读取属性& counterHub'未定义的

时间:2017-01-30 15:49:06

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

我正在尝试使用SignalR创建一个简单的用户计数器,但由于未知原因,我在控制台中收到此错误。我对signalR和asp.net很新,但我对我有意义,而且我不知道为什么我会收到错误。有人可以帮我解决这个问题并解释为什么会这样吗?

以下是索引视图中的代码。

<div class="row">
Number of online users <strong id="counter"></strong>
<script src="@Url.Content("~/Scripts/jquery-3.1.1.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.signalR-2.2.1.min.js")"></script>
<script src="@Url.Content("~/signalr/hubs")"></script>

<script>
    $(function () {
        var counterHub = $.connection.counterHub;
        $.connection.hub.start().done(function () {

        });
        counterHub.client.UpdateCount = function (count) {
            $("#counter").text(count);
        }
    });

</script>

集线器类:

public class CounterHub : Hub
{
    static long counter = 0;
    public override System.Threading.Tasks.Task OnConnected()
    {
        counter = counter + 1;
        Clients.All.UpdateCount(counter);
        return base.OnConnected();
    }

    public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
    {
        counter = counter - 1;
        Clients.All.UpdateCount(counter);
        return base.OnDisconnected(stopCalled);
    }

    //public void Hello()
    //{
    //    Clients.All.hello();
    //}
}

Startup.cs:

public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();

            ConfigureAuth(app);

        }
    }

2 个答案:

答案 0 :(得分:0)

您的聊天文件是否在应用程序的根目录中?

我认为您的页面唯一没有连接到Hub代理javascript文件:

  

ASP.NET SignalR JavaScript Library v1.0.0

此文件有一些连接到集线器的方法,包括:

$.hubConnection.prototype.createHubProxies = function () {
    var proxies = {};
    this.starting(function () {
        // Register the hub proxies as subscribed
        // (instance, shouldSubscribe)
        registerHubProxies(proxies, true);

        this._registerSubscribedHubs(); .......

缺少此方法会导致错误:

  

无法读取未定义的属性'counterHub'

因为它无法连接到滚刀并创建名为 counterHub 的对象。

所以请测试一下:在浏览器的另一个标签中加载你的应用程序后测试这个网址:

  

您应用内-URL / signalr /集线器

在本地主持人中有这样的事情:

  

http://localhost:53398/signalr/hubs

看看你是否得到了javascript文件。如果没有,我建议你开始另一个项目(如果是测试)。

答案 1 :(得分:0)

不知道为什么,但这最终让它对我有用。我刚用@section scripts包围了脚本标记:

    @section scripts{
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>

<script src="~/signalr/hubs"></script>
<script>
        $(function () {
            var myHub = $.connection.counterHub;
            $.connection.hub.start().done(function () {

            });
            myHub.client.UpdateCount = function (count) {
                $("#counter").text(count);
            }
        });

</script>
    }