SignalR: Wywoływanie metod z zewnętrznych klas

W poprzednich postach zakładaliśmy, że komunikacja między Hubem, a klientem (np. przeglądarką) odbywa się zawsze w wewnątrz hub’a,  w następnie wykonania metody serwerowej.

Bardzo często jednak jest potrzeba powiadomienia klienta po np. jakiś procesie biznesowym. Może to być automatycznie wykonywane zadanie czy po prostu akcja kontrolera.

Pierwsza próba, mogłaby wyglądać następująco:

var myFirstHub=new MyFirstHub();
myFirstHub.Clients.All.newNumber(number);

W ostatnim wpisie jednak napisałem, że instancja hub’a jest przechowywana przez SignalR i nie możemy sami manipulować nim. Powyższy kod zwróci zatem wyjątek InvalidOperationException:

Using a Hub instance not created by the HubPipeline is unsupported.

Prawidłowa inicjalizacja to zwrócenie kontekstu SignalR:

public ActionResult Increment(int number)
{                                   
  IHubContext hub=GlobalHost.ConnectionManager.GetHubContext<MyFirstHub>();
  hub.Clients.All.newNUmber(number);

  return View();
}

Jedna uwaga na koniec. Operacja GetHubContext może być czasochłonna i z tego względu, zawsze lepiej buforować kontekst a nie za każdym razem go tworzyć od nowa.

2 thoughts on “SignalR: Wywoływanie metod z zewnętrznych klas”

  1. Czemu nie dodasz dodatkowych tagów/kategorii do swoich postów? W tym przypadku signalr. Ciężko wyszukiwać konkretne rzeczy w jednej ogromnej kategorii ASP.NET

  2. Jak może wyglądać buforowanie kontekstu?
    A jak można by było “wstrzyknąć” taki kontekst do kontrolera (bo domyślam się, że huby, z racji tego, że są tworzone przez signalR , nie mogą być wstrzykiwane)?
    Musiałoby to być silnie typowane na konkretny hub?

Leave a Reply

Your email address will not be published.