【问题标题】:Why is my angular method not receiving anything from signalr为什么我的角度方法没有从信号器接收到任何东西
【发布时间】:2017-03-27 11:33:27
【问题描述】:

这是我的中心代码:

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace Voting.Hubs
{
    public class VotingHub: Hub
    {
        private static readonly IHubContext HubContext = GlobalHost.ConnectionManager.GetHubContext<VotingHub>();

        public override Task OnConnected()
        {
            Groups.Add(Context.ConnectionId, Context.Request.Url.Host);
            return base.OnConnected();
        }

        public static void SendVotingResults(string channel, string content)
        {
            HubContext.Clients.Group(channel).votingResultMessage(content);
        }
    }
}

我从我的 API 中这样调用它:

VotingHub.SendVotingResults(Request.Headers["Host"], GenerateJson(result));

在角度我有以下工厂:

app.factory('backendHubProxy', ['$rootScope',
  function ($rootScope) {

      function backendFactory(hubName) {
          var host = window.location.protocol + '//' + window.location.hostname;

          var connection = $.hubConnection(host);
          var proxy = connection.createHubProxy(hubName);
          connection.start().done(function () { });

          return {
              on: function (eventName, callback) {
                  proxy.on(eventName, function (result) {
                      $rootScope.$apply(function () {
                          if (callback) {
                              callback(result);
                          }
                      });
                  });
              }
          };
      };

      return backendFactory;
  }]);

然后在我的角度控制器中,我使用以下代码进行设置:

    var votingHub = backendHubProxy('votingHub');
    votingHub.on('votingResultMessage', function (data) {
        console.log(data);
    });

“Hub.OnConnect”似乎没有被调用,即使我的开发工具记录了

/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=9BlaqaLwJnMVduhWpMeQ0H0k0R5gV7rrHCQEdn5IV0KRRyRRD5C83v2AGQPXPzCLtMdAy5Tbus416oHgK%2FuAtPZYDRtiJw51reJKuq1kOcHu%2F5Hp9krbq1VmT8eZekjd&connectionData=%5B%5D&tid=0
/signalr/start?transport=webSockets&clientProtocol=1.5&connectionToken=9BlaqaLwJnMVduhWpMeQ0H0k0R5gV7rrHCQEdn5IV0KRRyRRD5C83v2AGQPXPzCLtMdAy5Tbus416oHgK%2FuAtPZYDRtiJw51reJKuq1kOcHu%2F5Hp9krbq1VmT8eZekjd&connectionData=%5B%5D&_=1490614124062

最后一次调用的响应是:{ "Response": "started" }

调用 SendVotingResults 在服务器上工作得很好,但客户端永远不会收到任何东西。

我做错了什么?

【问题讨论】:

    标签: javascript c# angularjs signalr


    【解决方案1】:

    我找到了解决此问题的另一种方法,它确实需要为您要在服务器上订阅的所有频道提供单独的功能,但至少它可以工作。我仍然无法弄清楚为什么上面的代码不起作用。

    app.service("signalrService", ['$rootScope', function ($rootScope) {
        this.votingResultMessages = function (callback) {
            var hub = $.connection.votingHub;
            $.extend(hub.client, {
                votingResultMessage: function(data) {
                    $rootScope.$apply(function () {
                            if (callback)
                                callback(data);
                        }
                    );
                }
    
            });
            $.connection.hub.start(function () { });
        }
    }]);
    

    你这样调用服务:

    signalrService.votingResultMessages(function (data) {
                            scope.voteResults = data.ResolutionDetail;
                        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多