web-dev-qa-db-fra.com

Comment appeler une méthode de concentrateur SignalR de l'extérieur?

Ceci est mon code Hub:

public class Pusher : Hub, IPusher
{
    readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

    public virtual Task PushToOtherInGroup(dynamic group, dynamic data)
    {
        return _hubContext.Clients.Group(group).GetData(data);
    }
}

Je veux appeler cette méthode dans un autre projet avec ce code:

var pusher = new Pusher.Pusher();
pusher.PushToOtherInGroup("Test", new {exchangeTypeId, price});

Je veux appeler PushToOtherInGroup, lorsque j'appelle la méthode, je ne reçois aucune erreur, mais le pousseur ne fonctionne pas.

Ceci est mon code Ui:

$(function() {
    hub = $.connection.pusher;
    $.connection.hub.start()
        .done(function() {
            hub.server.subscribe('newPrice');
            console.log('Now connected, connection ID=' + $.connection.hub.id);
        })
        .fail(function() { console.log('Could not Connect!'); });
});

(function() {
    hub.client.GetData = function (data) {
        debugger;
    };
});

Quel est mon problème?

13
user1968030

Vous ne pouvez pas instancier et appeler directement une classe hub comme ça. Le runtime de SignalR fournit beaucoup de tuyauterie autour d'une classe Hub en l'utilisant comme "classe ancienne" comme celle-là.

Le seul moyen d'interagir avec un concentrateur SignalR de l'extérieur consiste à obtenir une instance de IHubContext représentant le concentrateur à partir du runtime de SignalR. Vous ne pouvez le faire que dans le même processus. Ainsi, tant que votre autre "projet" sera en cours d'exécution avec le code SignalR, il fonctionnera. 

Si votre autre projet doit s'exécuter dans un autre processus, vous souhaitez exposer une sorte d'API "compagnon" qui est soit un autre concentrateur SignalR, soit un ancien service Web classique (avec l'API Web ASP.NET) que vous utilisez. peut appeler depuis cette autre application pour déclencher le comportement souhaité. Quelle que soit la technologie choisie, vous souhaiterez probablement la sécuriser afin que seules vos applications authentifiées puissent l'appeler.

Une fois que vous avez décidé quelle approche vous allez adopter, tout ce que vous feriez pour envoyer des messages via le hub Pusher serait:

// Get the context for the Pusher hub
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

// Notify clients in the group
hubContext.Clients.Group(group).GetData(data);
20
Drew Marsh

Si vous souhaitez appeler une méthode dans votre concentrateur à partir d'un autre projet, elle doit résider dans le même domaine d'application. Si c'est le cas, voici comment vous pouvez le faire:

Appelez une méthode hub à partir de l'action d'un contrôleur (ne vous occupez pas du titre, cela fonctionne pour votre scénario)

6
N. Taylor Mullen

Examinez le lien this dans la rubrique (Comment appeler des méthodes client et gérer des groupes extérieurs à la classe Hub).
Exemple de code crée simplement une instance singleton de la classe appelant et transmet la variable IHubContext à son constructeur. Ensuite, vous avez accès au context.Clients souhaité dans les méthodes de la classe appelante:

// This sample only shows code related to getting and using the SignalR context.
public class StockTicker
{
    // Singleton instance
    private readonly static Lazy<StockTicker> _instance = new     Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>()));

private IHubContext _context;

private StockTicker(IHubContext context)
{
    _context = context;
}

// This method is invoked by a Timer object.
private void UpdateStockPrices(object state)
{
    foreach (var stock in _stocks.Values)
    {
        if (TryUpdateStockPrice(stock))
        {
            _context.Clients.All.updateStockPrice(stock);
        }
    }
}
0
Rzassar