SignalR WebAPI - 未收到推送消息

时间:2014-10-21 10:31:13

标签: c# angularjs asp.net-web-api signalr

我的angularclient可以调用serverhub。但是从不接收来自服务器的推送消息,使用此行发送:
hub.Clients.All.serverTime(DateTime.UtcNow.ToString());

出于调试目的,我在订阅中添加了console.log(...)(signalrhubproxy.js):

proxy.on(eventName, function (result) {
      console.log('event:' + eventName + ' received.' ); <--- never fired
      $rootScope.$apply(function () {
          if (callback) {
              callback(result);
          }
      });
});

我已经按照本教程Pushing Data: Integrating with ASP.NET SignalR Hubs进行了一些操作 我的应用程序中的修改:

  • 它有一个带有startup.cs的WebAPI结构,具有此SignalR配置:

        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableDetailedErrors = true,
                EnableJSONP = true
            };
            map.RunSignalR(hubConfiguration);
        });
    

    而不是global.asax中的这个:

    RouteTable.Routes.MapHubs(new HubConfiguration             {EnableCrossDomain = true});

        AreaRegistration.RegisterAllAreas();
    
  • WebAPI在localhost:2034(VS)

  • 上运行
  • 客户端在localhost:9000(grunt)
  • 上运行

我能够:
- 从客户端调用servermethod getServerTime - 运行BackgroundServerTimeTimer
- 使用{<1}}获取hub

BackgroundServerTimeTimer

并通知客户:

hub = GlobalHost.ConnectionManager.GetHubContext<ClientPushHub>();

是我的盒子吗? - 我的盒子在Windows 7上运行,并且有VS 2013

更新 我已经实现了简单'Getting started chatsample'而没有更改服务器配置。那就是工作。所以,很清楚它在我的angularjs中是一个客户端问题。

2 个答案:

答案 0 :(得分:1)

app.js的值为.value('signalRServer', 'http://localhost:2032/')

网站上的示例创建了这样的hubproxies,没有使用.value:

function ServerTimeController($scope, signalRHubProxy) {
    var clientPushHubProxy = signalRHubProxy(
        signalRHubProxy.defaultServer, 'clientPushHub', <--- signalRHubProxy.defaultServer should be: signalRServer
            { logging: true });
    var serverTimeHubProxy = signalRHubProxy(
        signalRHubProxy.defaultServer, 'serverTimeHub'); <--- signalRHubProxy.defaultServer should be: signalRServer

    clientPushHubProxy.on('serverTime', function (data) {
        $scope.currentServerTime = data;
        var x = clientPushHubProxy.connection.id;
    });

    $scope.getServerTime = function () {
        serverTimeHubProxy.invoke('getServerTime', function (data) {
            $scope.currentServerTimeManually = data;
        });
    };
};

为了完整,正确的方式:

angular.module('yourApp').controller('yourCtrl', function ($scope, signalRHubProxy, signalRServer ) {

            var clientPushHubProxy = signalRHubProxy(
                signalRServer, 'clientPushHub',
                { logging: true });
            var serverTimeHubProxy = signalRHubProxy(
                signalRServer, 'serverTimeHub',
                { logging: true });

            clientPushHubProxy.on('serverTime', function (data) {

                $scope.currentServerTime = data;
                //jshint unused:false
                var x = clientPushHubProxy.connection.id;

                console.log('Client pushhubproxy id: ' + x );

            });
 .....

答案 1 :(得分:0)

真正的问题:我正在挖掘不同的signalR版本和旧版本的示例。

以下是SignalR 2的版本:signalr angular example