Angularjs 信号服务器没有';在客户端上不一致地调用方法

Angularjs 信号服务器没有';在客户端上不一致地调用方法,angularjs,signalr,signalr-hub,Angularjs,Signalr,Signalr Hub,我有一个AngularJS应用程序,我打算让它通过信号器从服务器接收通信,最明显的是当数据发生变化时,我希望客户端刷新自己 以下是我的集线器逻辑: [HubName("update")] public class SignalRHub : Hub { public static void SendDataChangedMessage(string changeType) { var context = GlobalHost.

我有一个AngularJS应用程序,我打算让它通过信号器从服务器接收通信,最明显的是当数据发生变化时,我希望客户端刷新自己

以下是我的集线器逻辑:

[HubName("update")]
    public class SignalRHub : Hub
    {
        public static void SendDataChangedMessage(string changeType)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();
            context.Clients.All.ReceiveDataChangedMessage(changeType);
        }
    }
在AngularJS应用程序中,我使用HTML页面中引用的以下javascript为SignalR创建了一个服务:

angular.module('MyApp').value('signalr', $.connection.update);
在AngularJS模块的根目录中,我使用以下内容设置它,以便它启动并可以看到调试输出:

$(function () {
    $.connection.hub.logging = true;
    $.connection.hub.start();
});

$.connection.hub.error(function(err) {
    console.log('An error occurred: ' + err);
});
然后我有了我的控制器。它包含了各种各样的精彩内容,但我将展示与此相关的基本内容:

angular.module('MyApp').controller('MyController', function($scope, signalr) {
  signalr.client.ReceiveDataChangedMessage = function dataReceived(changeType) {
    console.log('DataChangedUpdate: ' + changeType);
  };
});
不幸的是,当我在javascript中设置断点时,尽管程序的其余部分工作正常(包括在API中执行操作),但这永远不会执行

一些额外(希望)有用的信息:

  • 如果我在SignalRHub类中设置了一个断点,该方法将按预期成功调用,并且不会抛出任何异常

  • 如果我看Fiddler,我可以看到轮询操作,但从来没有看到任何呼叫被发送到客户端的迹象

  • Chrome控制台显示AngularJS客户端协商websocket端点,打开它,启动启动请求,转换到连接状态,并通过警告和连接丢失超时监视保持活动。没有迹象表明客户端曾经与服务器断开连接

  • 我引用了
    http://localhost:port/signalr/hubs
    在我的HTML文件中,因此我忽略了我收到的第一个错误,即没有订阅集线器。部分原因是控制台中的下一条消息是与服务器的协商,如果我以后在控制台中使用“$.connection.hub”,我将看到填充的对象


我感谢你能提供的任何帮助。谢谢

在这里复制它并不容易,但很可能在连接启动后调用控制器函数。您可以在控制器的第一行和
start
调用上使用几个断点进行验证。如果我是对的,这就是为什么不回叫您,因为必须在启动连接之前定义对客户机成员的回调。尝试重新构造代码,以确保正确的顺序。

成功了。我使用了在中提供的关于如何将连接逻辑放入Angular服务而不是应用程序的Run()方法的指导,然后在调用连接初始化之前创建了函数。谢谢
angular.module('MyApp').controller('MyController', function($scope, signalr) {
  signalr.client.ReceiveDataChangedMessage = function dataReceived(changeType) {
    console.log('DataChangedUpdate: ' + changeType);
  };
});