2013-07-08 10 views
11

Das ist mein Hub Code:Call-Hub-Methode in C# -Code

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); 
     } 
     } 

ich mit diesem Code diese Methode in einem anderen Projekt nennen wollen:

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

ich rufenden PushToOtherInGroup, beim Aufruf der Methode Ich bekomme keinen Fehler.aber Drücker funktioniert nicht.

Das ist mein Ui-Code:

$(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; 
      }; 
     }); 

Was ist mein Problem?

Antwort

17

Sie können nicht instanziiert werden und so direkt eine Naben Klasse aufrufen. Es wird viel um eine Hub-Klasse herum von der SignalR-Laufzeitumgebung bereitgestellt, die Sie umgehen, indem Sie sie als "normale Klasse" verwenden.

Die einzige Möglichkeit, von außen mit einem SignalR-Hub zu interagieren, besteht darin, eine Instanz von IHubContext zu erhalten, die den Hub aus der SignalR-Laufzeit darstellt. Sie können dies nur innerhalb desselben Prozesses tun, so lange Ihr anderes "Projekt" mit dem SignalR-Code läuft, wird es funktionieren.

Wenn Ihr anderes Projekt in einem anderen Prozess ausgeführt wird, möchten Sie eine Art "Companion" API bereitstellen, die entweder ein anderer SignalR-Hub oder ein normaler alter Webdienst (mit ASP.NET-Web) ist API), die Sie von dieser anderen Anwendung aus aufrufen können, um das gewünschte Verhalten auszulösen. Für welche Technologie Sie sich auch entscheiden, Sie möchten dies wahrscheinlich so sichern, dass nur Ihre authentifizierten Anwendungen es aufrufen können.

Sobald Sie die Sie gehen zu nehmen entscheiden nähern, alles, was Sie tun würden Nachrichten über den Pusher Hub auszusenden wäre:

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

// Notify clients in the group 
hubContext.Clients.Group(group).GetData(data); 
6

Wenn Sie eine Methode in Ihrem Hub von einem anderen Projekt aus aufrufen möchten, muss sie sich in derselben App-Domäne befinden. Wenn es hier tut, wie Sie es tun können:

Call a hub method from a controller's action (bitte den Titel nichts dagegen, es für Ihr Szenario funktioniert)

1

Werfen Sie einen Blick auf this Link zu dem Thema (Wie Client-Methoden aufrufen und Gruppen außerhalb der Hub-Klasse verwalten.
Code-Beispiel erstellt einfach eine Singleton-Instanz der Aufrufer-Klasse und übergeben Sie die IHubContext in den Konstruktor. Dann haben Sie Zugriff auf die gewünschte context.Clients in Aufrufer-Methoden:

// 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); 
     } 
    } 
}