2013-07-27 11 views
15

Używam SignalR 2 i nie mogę zrozumieć, w jaki sposób mogę korzystać z moich metod Hub, np. Z działania kontrolera.Użyj metod Hub z kontrolera?

wiem, że mogę wykonać następujące czynności:

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

Ale to wykonuje metodę bezpośrednio na stronie klienta.

Co mam zrobić, jeśli mam logikę biznesową po mojej stronie serwera? ClientSideMethod(param) metoda Chcę wywołać z mojego kontrolera w taki sam sposób, jak po wywołaniu od strony klienta?

W tej chwili używam public static void ClientSideMethod(param) wewnątrz mojego koncentratora iw tej metodzie używam IHubContext z ConnectionManager.

Czy nie ma lepszego sposobu na robienie tego?

Poniższa nie działa (już w SignalR 2):

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

Tam dostać „Hub nie stworzony przez rurociąg Hub nie jest obsługiwany” wyjątek, gdy dostęp do klientów.

+0

Dlaczego nie zrobić z klientem, które zakładam jest JS, można wykonać żądania Ajax i zrobić co trzeba na kontrolerze – MEYWD

+1

@MEYWD: Ponieważ na przykład mam interfejs administratora, który chciałbym zaktualizować, gdy "coś się stanie". Na przykład. klient odwiedza określoną stronę, więc chciałbym wywołać metodę koncentratora w akcji kontrolera z tej strony. Faktyczny klient nie dba o to, więc dlaczego miałby opublikować tę wiadomość? – ChrFin

+0

Zrobiłem coś podobnego, mam klientów i administratorów (specjalny klient), administrator wysyła polecenie i czeka na odpowiedź od klienta, robiąc to, stworzyłem listę administratorów i listę klientów w hubie, admin wybiera klienta, rezerwuje go, aby żaden inny administrator go nie używał, następnie wysyła polecenie, hub przekazuje je klientowi, klient zwraca odpowiedź do centrum, który w zamian jest przekazywany do administratora, a odpowiedź jest drukowana ekran – MEYWD

Odpowiedz

11

Ponieważ nie mogę znaleźć „dobre rozwiązanie” I używam rozwiązanie @ michael.rp za pomocą pewnych ulepszeń:

zrobiłem utworzyć następujące klasy podstawowej:

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

a potem n rzeczywisty koncentrator (np. public class AdminHub : Hub<AdminHub>) Mam (statyczne) metody, takie jak następujące:

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

To potęga praca utworzyć klasę „pomocnika”, który implementuje reguł biznesowych i nazywa się zarówno koncentratora i kontroler:

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, ponieważ jest to już lepsze podejście niż moje, ale nadal chciałbym móc użyć metody Hub "bezpośrednio", ponieważ wydaje mi się "jaśniejsze" i "łatwiejsze do zrozumienia" dla mnie ... – ChrFin

+0

@ChrFin Czy kiedykolwiek znalazłeś sposób, aby skutecznie wywoływać metody piasty z wnętrza zespołu? Bez możliwości wywołania instancji huba ta opcja wydaje się najbardziej SUCHA i podzielona na sekcje. –

+0

@BrandonWittwer: Nie, niezupełnie. Po prostu nie uznałem odpowiedzi jako zaakceptowanej, ponieważ wciąż mam nadzieję na "rozwiązanie natywne". Dodam odpowiedź z moim rozwiązaniem, które mam w tej chwili ... – ChrFin

Powiązane problemy