2014-10-24 16 views
7

Używam SignalR w wersji 2.1.2. Zauważyłem, że istnieją dwie publiczne klasy piasty dla mnie, Hub i Hub<T>. Ta pierwsza ma stronę MSDN, która wydaje się być przestarzała, a druga nie ma żadnej strony MSDN. Wierzę, że dokumentacja MSDN nie jest aktualna z najnowszą wersją SignalR z Nuget (której używam), ponieważ źródła dekompilowane za pomocą programu ReSharper pokazują, że obie klasy dziedziczą po klasie bazowej HubBase. Dziedziczenie sekcji hierarchii stronie MSDN pokazuje klasę Hub dziedziczenia z Object i realizacji IHub i IDisposable interfejsy jednak dekompilowana źródła ujawniają wspomnianej klasy HubBase Base, z wykorzystaniem interfejsu IHub co z kolei realizuje IDisposable.Jak korzystać z ogólnego koncentratora w SignalR

Różnica między non-rodzajowego i rodzajowego wariantu zajęć jest to, że non-generic czyjaś własność Clients zwraca IHubCallerConnectionContext<dynamic> natomiast generyczne powraca wariant wpisane IHubCallerConnectionContext<T>.

Chciałbym, aby moi klienci pisali na maszynie, więc gdy zadzwonię do metody klienta z koncentratora, będę miał odpowiednie wsparcie IntelliSense i mocno wpisane argumenty. Z czym walczę, to jednak wiedzieć, że metoda mojego modelu klienta jest rzeczywiście wywoływana w przeglądarce.

To mój TestModel klasa:

public sealed class TestModel 
{ 
    public String Name { get; set; } 
    public void Notify() {} 
    public void NotifyComplex(TestModel model) {} 
} 

Z non-generic hub, to bym po prostu zadzwoń .Notify() lub .Notify(new TestModel() { Name = "sth" }) na dynamic ly związany this.Context.Clients.Client(…) lub this.Context.Caller, ale z klasą rodzajową, gdy zgłoszę te puste metody w podobny sposób, przeglądarka nie jest w ogóle powiadamiana.

Jak korzystać z ogólnej klasy piasty w taki sposób, w jaki ma być używana?

+0

to może być przydatne: http://stackoverflow.com/a/21763587/526704 – DLeh

+0

Obawiam się, że pytanie nie ma związku. Interesuje mnie wywoływanie metod klienta z serwera, a nie na odwrót, co robi OP tego pytania, a metody, które chcę wywołać za pomocą RPC, nie są ogólne, ale i tak jest ich klienci. Doceniam ten komentarz. –

+0

Nie byłem pewien, czy byłoby to pomocne, czy nie, ale myślałem, że dostarczę to, co znalazłem. Przepraszam, nie mam innego pożytecznego wglądu :( – DLeh

Odpowiedz

8

Znalazłem odpowiedź. W dokumentacji MSDN nie jest up-to-date, jak dotąd, ale strona ASP NET oferuje tutoriale ładny SignalR a jeden z nich obejmuje wpisane Piasty:

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#stronglytypedhubs

Jako przykład pokazuje artykuł, jeśli używasz interfejsu dla argumentu typu, wszystko działa i otrzymujesz silnie wpisane klienty koncentrujące, których metody zostały poprawnie przetłumaczone na RPC. Oto fragment kodu testowałem to z:

public sealed class TestHub 
    : Hub<ITestClient> 
{ 
    public override Task OnConnected() 
    { 
    this.Clients.Caller.SayHello("Hello from OnConnected!"); 
    return base.OnConnected(); 
    } 

    public void Hi() 
    { 
    // Say hello back to the client when client greets the server. 
    this.Clients.Caller.SayHello("Well, hello there!"); 
    } 
} 

public interface ITestClient 
{ 
    void SayHello(String greeting); 
} 
+1

Pamiętaj, że aby wywołać metodę "OnConnected", musisz zarejestrować najpierw metoda klienta: '$ .connection.testHub.client.sayHello = funkcja (g) {...}'. Z założenia ten klient, którego nie można nazwać, nie uruchamia metod 'On [Connected | Reconnected | Disconnected] 'i może wywoływać tylko takie metody hubu, jak paradygmat żądanie-odpowiedź. –

Powiązane problemy