SignalR服务器并不总是在客户端上调用方法

时间:2014-08-06 13:12:00

标签: angularjs signalr signalr-hub

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

以下是我的集线器逻辑:

[HubName("update")]
    public class SignalRHub : Hub
    {
        public static void SendDataChangedMessage(string changeType)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();
            context.Clients.All.ReceiveDataChangedMessage(changeType);
        }
    }

在成功发生数据操作后,我在API中使用以下内容将消息发送给客户端:

SignalRHub.SendDataChangedMessage("newdata");

在我的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端点,打开它,启动启动请求,转换到连接状态,并通过警告和连接丢失超时监视保持活动状态。没有迹象表明客户端与服务器断开连接。

  • 我在我的HTML文件中引用http://localhost:port/signalr/hubs处可用的代理脚本,因此我忽略了我收到的第一个错误,指出没有订阅集线器。部分是因为控制台中的下一条消息是与服务器的协商,如果我稍后使用&#39; $。connection.hub&#39;在控制台中,我会看到填充的对象。

感谢您提供的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

在这里重现它并不容易,但很可能在连接开始后调用控制器功能。您可以在控制器的第一行和start调用上验证几个断点。如果我是对的,那就是你没有被回叫的原因,因为必须在开始连接之前定义客户端成员的回调。尝试重新编写代码以确保正确的顺序。