SignalR: Przekazywanie stanu

Obiekty Hub mają z góry określony czas życia. Ten sam obiekt nie jest współdzielony pomiędzy różne wywołania. Jeśli klient wywołuje metodę, instancja huba jest tworzona od nowa. Oznacza to, że nie możemy przechować stanu między zapytaniami w następujący sposób:

public class MyFirstHub : Hub
{
    private int _number = 0;

    public void Increment()
    {
        _number++;
        Clients.All.newNumber(_number);
    }
}

Na wyjściu takim sposobem, zawsze będzie jeden – za każdym wywołaniem instancja jest tworzona od nowa.

Pozostają inne opcje takie jak baza danych, zmienne statyczne itp. SignalR dostarcza jednak pewien mechanizm, który dla małej ilości danych jest dobry.

Każdy klient podłączony do Hub może przekazać swój stan w następujący sposób:

public class MyFirstHub : Hub
{    
   public void Increment()
   {
       Clients.Caller.number++;
       Clients.All.newNumber(Clients.Caller.number);
   }
}

Zmienna number w powyższy przykładzie to nasz stan. Z kolei Caller jak wcześniej, reprezentuje klienta, który wykonał daną metodę serwerową.

W JavaScript z kolei, możemy ustawić stan na dowolną wartość:

var myFirstHub = $.connection.myFirstHub;
myFirstHub.state.number = 0;

Oczywiście należy pamiętać, że cały stan, z każdym zapytaniem będzie wysyłany do serwera i potem zwracany. Z tego względu, lepiej ograniczyć się do małych zmiennych.