【问题标题】:SignalR WebAPI - Push message not receivedSignalR WebAPI - 未收到推送消息
【发布时间】:2014-12-16 13:12:11
【问题描述】:

我的 angularclient 能够调用 serverhub。但永远不会收到来自服务器的推送消息,使用此行发送:
hub.Clients.All.serverTime(DateTime.UtcNow.ToString());

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

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(新的 HubConfiguration { EnableCrossDomain = true });

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

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

我能够:
- 从客户端调用服务器方法getServerTime
- 运行BackgroundServerTimeTimer
- 在BackgroundServerTimeTimer 中获取hub

hub = GlobalHost.ConnectionManager.GetHubContext&lt;ClientPushHub&gt;();

并通知客户:

hub.Clients.All.serverTime(DateTime.UtcNow.ToString()); &lt;--- no error serverside, no glory clientside

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

更新 我已经实现了简单的'Getting started chatsample',而没有更改服务器配置。这很有效。所以,很明显这是我的 angularjs 中的客户端问题。

【问题讨论】:

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


    【解决方案1】:

    app.js 有一个值:.value('signalRServer', 'http://localhost:2032/')

    网站上的示例创建了这样的 hubproxy,没有使用 .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 );
    
                });
     .....
    

    【讨论】:

    • 留下了奇怪的问题。我已将该项目与简单的聊天示例合并。当我从页面中删除警报时,没有收到推送。我认为,连接需要一些时间。但是带有警报框的阻塞呼叫很难看...
    【解决方案2】:

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

    这是 SignalR 2 的版本,位于:signalr angular example

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2012-10-27
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2022-01-25
      • 2015-04-02
      • 2020-07-16
      • 2016-07-21
      相关资源
      最近更新 更多