2013-07-08 6 views
11

Questo è il mio codice Hub:metodo di chiamata Hub nel codice C#

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

voglio chiamare questo metodo in un altro progetto con questo codice:

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

voglio chiamare PushToOtherInGroup, quando si chiama il metodo non ho alcun errore.ma il pusher non funziona.

Questo è il mio codice 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; 
      }; 
     }); 

Qual è il mio problema?

risposta

17

Non è possibile creare un'istanza e chiamare una classe hub direttamente così. C'è un sacco di plumbing fornito intorno a una classe Hub dal runtime SignalR che si sta bypassando usandolo come una "classe semplice" come quella.

L'unico modo per interagire con un hub SignalR dall'esterno è quello di ottenere effettivamente un'istanza di IHubContext che rappresenta l'hub dal runtime SignalR. Puoi farlo solo all'interno dello stesso processo, quindi finché funzionerà il tuo altro "progetto" in esecuzione con il codice SignalR.

Se l'altro progetto verrà eseguito in un altro processo, ciò che si vorrebbe fare è esporre una sorta di API "companion" che è un altro hub SignalR o un vecchio servizio Web normale (con Web ASP.NET API) che è possibile chiamare da questa altra applicazione per attivare il comportamento desiderato. Qualunque tecnologia tu scelga, probabilmente vorresti proteggerla in modo che solo le tue applicazioni autenticate possano chiamarla.

volta che si decide quale approccio si sta andando a prendere, tutto si dovrebbe fare per inviare i messaggi tramite l'hub Pusher sarebbe:

// 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

Se stai cercando di chiamare un metodo nel tuo hub da un altro progetto, deve risiedere nello stesso dominio dell'app. Se lo fa ecco come si può fare:

Call a hub method from a controller's action (non mente il titolo, funziona per lo scenario)

1

Date un'occhiata a this link in tema di (Come chiamare i metodi client e gestire gruppi esterni alla classe Hub).
L'esempio di codice crea semplicemente un'istanza singleton della classe chiamante e passa nel suo IHubContext nel suo costruttore. Quindi hai accesso allo context.Clients desiderato nei metodi della classe chiamante:

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