我在本地Service Fabric集群上托管的ASP.NET Stateful项目中有一个Hub,我已经覆盖了 OnConnected 方法 . 在 OnConnected 方法上放置断点时,它没有输入,但同时,通过集线器正确地广播消息 .

枢纽类:

public class NotificationHub : BaseHub
{
    private IFragStateManager _stateManager;
    private static IHubContext _context;

    public NotificationHub(IFragStateManager stateManager) : this(stateManager, _context)
    {
        _stateManager = stateManager;
        _context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    }

    private NotificationHub(IFragStateManager stateManager, IHubContext context) : base(stateManager, context)
    { }

    /// <summary>
    /// Broadcasts payload to all clients
    /// </summary>
    /// <param name="payload"></param>
    public void Broadcast(object payload)
    {
        try
        {
            _context.Clients.All.broadcast(payload);
        }
        catch (Exception e)
        {
            Log.Error(e.ToString());
        }            
    }

    //Investigate more why it's not hitting breakpoint while it actually connects and broadcasts messages
    public override Task OnConnected()
    {
        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        return base.OnDisconnected(stopCalled);
    }
}

_context.Clients.All.broadcast(payload); 运作良好 . 它成功地提供了有效负载

Hub的基类:

public abstract class BaseHub : Hub
    {
        protected IPrincipal User {
            get { return base.Context.User ?? _user; }
        }

        private ClaimsPrincipal _user;
        private Guid _userId;

        private IFragStateManager _stateManager;
        private IHubContext _context;

        public BaseHub(IFragStateManager stateManager, IHubContext context)
        {
            _stateManager = stateManager;
            _context = context;
        }        

        public override async Task OnConnected()
        {
            GetUserId();

            var map = await _stateManager.GetOrAddAsync<FragDictionary<Guid, string>>("UserConnectionMap");

            using (var tx = _stateManager.CreateTransaction())
            {
                var exisingValue = await map.TryGetValueAsync(tx, _userId);
                await map.SetAsync(tx, _userId, Context.ConnectionId);
                await tx.CommitAsync();
            }

            await base.OnConnected();
        }        

        public override async Task OnDisconnected(bool stopCalled)
        {
            var map = await _stateManager.GetOrAddAsync<FragDictionary<Guid, string>>("UserConnectionMap");

            using (var tx = _stateManager.CreateTransaction())
            {
                await map.TryRemoveAsync(tx, _userId); 
                await tx.CommitAsync();
            }

            await base.OnDisconnected(stopCalled);
        }

        private void GetUserId()
        {

            if (Context.User == null)
                _user = (ClaimsPrincipal)(IPrincipal)Context.Request.Environment["server.User"];
            else
                _userId = new Guid(_user.FindFirst("AccountId").Value);
        }
    }

枢纽客户:

$.connection.hub.logging = true;
    $.connection.hub.url = 'http://localhost:8298/api/realtime/70c604f8-7996-4107-9ec3-28d08c869899/131810464642593740/4b98412e-8f09-4460-9c90-1d155cb8efca/signalr';

    var hub = $.connection.notificationHub;

    $.extend(hub.client, {
        broadcast: function (msg) {console.log(msg)}
    });

    $.connection.hub.start().done(function() {
        console.log('Connected');
    });

客户脚本:

<script src="Scripts/jquery-1.6.4.js"></script>
<script src="Scripts/jquery.signalR-2.1.0.js"></script>
<script src="http://localhost:8298/api/realtime/70c604f8-7996-4107-9ec3-28d08c869899/131810464642593740/4b98412e-8f09-4460-9c90-1d155cb8efca/signalr/hubs"></script>

已经检查过的内容:

  • 降级SignalR . 从2.3到2.1 . 没有结果 .

  • js客户端已订阅,所以这里可能没有问题 .

  • 当从后端代码中调用Hub时,它会正确地广播消息 .