2013-07-27 5 views
15

Sto utilizzando SignalR 2 e non riesco a capire come utilizzare i miei metodi Hub, ad esempio all'interno di un'azione del controller.Utilizzare i metodi Hub dal controller?

so di poter effettuare le seguenti operazioni:

var hub = GlobalHost.ConnectionManager.GetHubContext<T>(); 
hub.Clients.All.clientSideMethod(param); 

Ma che esegue il metodo direttamente sul lato client.

Cosa succede se ho una logica di business nel mio lato server ClientSideMethod(param) metodo Voglio chiamare dal mio controller allo stesso modo di quando viene chiamato dal lato client?

Al momento io uso public static void ClientSideMethod(param) all'interno del mio hub e in tale metodo io uso il IHubContext dal ConnectionManager.

Non c'è niente di meglio da fare?

La seguente non funziona (più in SignalR 2?):

var hubManager = new DefaultHubManager(GlobalHost.DependencyResolver); 
instance = hubManager.ResolveHub(typeof(T).Name) as T; 
instance.ClientSideMethod(param); 

Ci ho un "Hub non creato tramite Hub gasdotto non supportato" eccezione, quando si accede i Clienti.

+0

perché non farlo da parte del cliente, che presumo è JS, si può fare una richiesta Ajax e fare quello che ti serve sul controller – MEYWD

+1

@MEYWD: Perché ad esempio ho un'interfaccia di amministrazione che vorrei aggiornare quando "succede qualcosa". Per esempio. il client visita una pagina specifica, quindi vorrei attivare il metodo hub nell'azione del controller da quella pagina. Il vero cliente non se ne preoccupa, quindi perché dovrebbe pubblicare quel messaggio? – ChrFin

+0

ho fatto qualcosa di simile, ho clienti e amministratori (client speciali), l'amministratore invia un comando e aspetta la risposta dal client, per fare ciò ho creato un elenco di amministratori e un elenco di client sull'hub, il admin sceglie un client, lo riserva in modo che nessun altro amministratore lo usi, quindi invia un comando, l'hub lo inoltra al client, il client restituisce la risposta all'hub, che in cambio viene inoltrato all'amministratore e la risposta viene stampata su lo schermo – MEYWD

risposta

11

Come non ho trovato una "buona soluzione" I sto usando la soluzione di @ michael.rp con alcuni miglioramenti:

ho fatto creare la seguente classe di base:

public abstract class Hub<T> : Hub where T : Hub 
{ 
    private static IHubContext hubContext; 
    /// <summary>Gets the hub context.</summary> 
    /// <value>The hub context.</value> 
    public static IHubContext HubContext 
    { 
     get 
     { 
      if (hubContext == null) 
       hubContext = GlobalHost.ConnectionManager.GetHubContext<T>(); 
      return hubContext; 
     } 
    } 
} 

e poi ho n l'hub attuale (ad es. public class AdminHub : Hub<AdminHub>) ho() metodi statici, come il seguente:

/// <summary>Tells the clients that some item has changed.</summary> 
public async Task ItemHasChangedFromClient() 
{ 
    await ItemHasChangedAsync().ConfigureAwait(false); 
} 
/// <summary>Tells the clients that some item has changed.</summary> 
public static async Task ItemHasChangedAsync() 
{ 
    // my custom logic 
    await HubContext.Clients.All.itemHasChanged(); 
} 
11

E forza lavoro per creare una classe di "aiuto" che implementa le regole aziendali e viene chiamato da sia il vostro Hub e il controller:

public class MyHub : Hub 
{ 
    public void DoSomething() 
    { 
     var helper = new HubHelper(this); 
     helper.DoStuff("hub stuff"); 
    } 
} 

public class MyController : Controller 
{ 
    public ActionResult Something() 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     var helper = new HubHelper(hub); 
     helper.DoStuff("controller stuff"); 
    } 
} 

public class HubHelper 
{ 
    private IHubConnectionContext hub; 

    public HubHelper(IHubConnectionContext hub) 
    { 
     this.hub = hub; 
    } 

    public DoStuff(string param) 
    { 
     //business rules ... 

     hub.Clients.All.clientSideMethod(param); 
    } 
} 
+0

+1 in quanto è già un approccio migliore del mio, ma mi piacerebbe comunque poter utilizzare i metodi Hub "direttamente" come sembra "più chiaro" e "più facile da capire" per me ... – ChrFin

+0

@ChrFin hai mai trovato un modo per chiamare con successo i metodi hub dall'assemblaggio? Senza essere in grado di chiamare un'istanza dell'hub, questa opzione sembra essere la più ASCIUTTA e compartimentata. –

+0

@BrandonWittwer: No, non proprio. Non ho appena contrassegnato la risposta come accettata, mentre spero ancora in una "soluzione nativa". Aggiungerò una risposta con la mia soluzione che ho al momento ... – ChrFin