SignalR 组注册服务器方法未被命中

SignalR group registration server methods not being hit

我已按照本指南进行操作,ASP.NET SignalR Hubs API Guide (How to manage group membership from the Hub class),但无法让我的服务器端 ShipmentHub 方法执行。

我的 ShipmentHub class 看起来像这样:

public class ShipmentHub : Hub
{
    IShipmentLogic shipmentLogic;

    public ShipmentHub(IShipmentLogic shipmentLogic)
    {
        this.shipmentLogic = shipmentLogic;
    }

    public void CreateShipment(IEnumerable<Shipment> shipments)
    {
        // Clients.All.createShipment(shipments.OrderByDescending(s => s.CreatedDate));
        Clients.Group(shipments.FirstOrDefault().ShipmentId)
               .createShipment(shipments.OrderByDescending(s => s.CreatedDate));
    }

    public async Task WatchShipmentId(string shipmentId)
    {
        await Groups.Add(Context.ConnectionId, shipmentId);
        Clients.Group(shipmentId).createShipment(shipmentLogic.Get(shipmentId, true));
    }

    public Task StopWatchingShipmentId(string shipmentId)
    {
        return Groups.Remove(Context.ConnectionId, shipmentId);
    }
}

我的客户大致是这样的:

var shipmentHub = $.connection.shipmentHub;
$.connection.hub.logging = true;
$.connection.hub.start();

var shipmentId = "SHP-W-GE-100122";
        
if (previousShipmentId) {
    shipmentHub.server.stopWatchingShipmentId(previousShipmentId);
}

if (shipmentId.length) {
    previousShipmentId = shipmentId;
    shipmentHub.server.watchShipmentId(shipmentId);
}

在 SignalR 客户端日志中,我看到正在调用这些:

SignalR: Invoking shipmenthub.WatchShipmentId

SignalR: Invoking shipmenthub.StopWatchingShipmentId

SignalR: Invoking shipmenthub.WatchShipmentId

而且,除了日志之外,这些方法 被命中:

proxies['shipmentHub'].server = {
    createShipment: function (shipments) {
        return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["CreateShipment"], $.makeArray(arguments)));
     },

    stopWatchingShipmentId: function (shipmentId) {
        return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["StopWatchingShipmentId"], $.makeArray(arguments)));
     },

    watchShipmentId: function (shipmentId) {
        return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["WatchShipmentId"], $.makeArray(arguments)));
     }
};

最后一点,在我添加 WatchStopWatching 方法之前,其他所有方法都有效(即 CreateShipment 会调用 Client.All.createShipment 方法而不用问题)。

您需要等待建立与服务器的连接,然后才能开始从客户端调用服务器上的方法。 hub.start() returns 一个承诺,这是在承诺得到解决后做某事的基本模式。

 var shipmentHub = $.connection.shipmentHub;
    $.connection.hub.logging = true;
    $.connection.hub.start().done(talkToServer);

    var talkToServer=function(){
    var shipmentId = "SHP-W-GE-100122";
        if (previousShipmentId) {
            shipmentHub.server.stopWatchingShipmentId(previousShipmentId);
        }

        if (shipmentId.length) {
            previousShipmentId = shipmentId;
            shipmentHub.server.watchShipmentId(shipmentId);
        }
}

问题是由于 ShipmentHub 中的参数化构造函数引起的。根据Dependency Injection in SignalR:

By default, SignalR expects a hub class to have a parameterless constructor. However, you can easily register a function to create hub instances, and use this function to perform DI. Register the function by calling GlobalHost.DependencyResolver.Register.

因此,您需要修改 Startup.Configuration(IAppBuilder app) 方法来为您解决依赖关系:

GlobalHost
    .DependencyResolver
    .Register(
        typeof(ShipmentHub), 
           () => new ShipmentHub(new ShipmentLogic()));