2014-10-24 14 views
7

Sto utilizzando SignalR nella versione 2.1.2. Ho notato che ci sono due classi di hub pubbliche da utilizzare, Hub e Hub<T>. Il primo ha una pagina MSDN che sembra essere superata e quest'ultima non ha alcuna pagina MSDN. Credo che la documentazione MSDN non sia aggiornata con l'ultima versione di SignalR da Nuget (che sto usando), perché le fonti decompilate con l'aiuto di ReSharper mostrano che entrambe le classi ereditano dalla classe base HubBase. sezione Gerarchia di ereditarietà della pagina MSDN mostra la classe Hub come eredita da Object e attuazione IHub e IDisposable interfacce, tuttavia le fonti decompilati rivelano la suddetta classe HubBase base, implementando l'interfaccia IHub che a sua volta implementa IDisposable.Come utilizzare hub generico in SignalR

La differenza tra la variante non generico e generico delle classi è che l'uno non generico proprietà Clients restituisce IHubCallerConnectionContext<dynamic> mentre i rendimenti variante generici digitati IHubCallerConnectionContext<T>.

Mi piacerebbe che i miei client fossero digitati, quindi quando chiamo i metodi client dall'hub, avrei un supporto Intellisense adeguato e argomenti fortemente tipizzati. Quello con cui faccio fatica, però, è come far sapere all'Hub che il metodo del mio modello client deve essere effettivamente invocato nel browser.

Questo è il mio TestModel classe:

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

Con l'hub non generico, avevo appena chiamo .Notify() o .Notify(new TestModel() { Name = "sth" }) sul dynamic mente vincolata this.Context.Clients.Client(…) o this.Context.Caller, ma con la classe generica, quando chiamo questi metodi vuoti in modo simile, il browser non viene affatto informato.

Come si utilizza la classe hub generica come deve essere utilizzata?

+0

questo potrebbe essere utile: http://stackoverflow.com/a/21763587/526704 – DLeh

+0

Ho paura che la domanda non è correlato. Sono interessato a chiamare i metodi client dal server, non viceversa, che è ciò che l'OP di quella domanda sta facendo e i metodi che voglio chiamare usando RPC non sono generici, l'hub è, però, e lo è anche il suo clienti. Apprezzo il commento, però. –

+0

non ero sicuro se sarebbe stato utile o no, ma ho pensato di fornire quello che ho trovato. scusa non ho altre utili intuizioni :( – DLeh

risposta

8

Ho trovato la risposta. La documentazione MSDN non è up-to-date come ancora, ma il sito di ASP .NET offre tutorial bella SignalR e uno di loro copre i mozzi digitati:

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

Come l'esempio negli spettacoli articolo, se si utilizza un'interfaccia per l'argomento type, tutto funziona e si ottengono client hub fortemente tipizzati i cui metodi sono tradotti correttamente in RPC s. Ecco un pezzo di codice che ho provato questo con:

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

Ricorda che per poter chiamare il metodo 'OnConnected' devi registrare un prima il metodo client: '$ .connection.testHub.client.sayHello = function (g) {...}'. È in base alla progettazione che quel client, che non può essere chiamato, non attiva i metodi 'On [Connesso | Riconnesso | Disconnesso]' e può solo richiamare i metodi hub in modo simile al paradigma richiesta-risposta. –

Problemi correlati