2014-10-24 9 views
7

Ich benutze SignalR in Version 2.1.2. Ich habe bemerkt, dass es zwei öffentliche Hub-Klassen für mich gibt, Hub und Hub<T>. Ersteres hat eine MSDN-Seite, die veraltet zu sein scheint, und letztere fehlt überhaupt eine MSDN-Seite. Ich glaube, dass die MSDN-Dokumentation nicht mit der neuesten Version von SignalR von Nuget (die ich verwende) aktualisiert wird, da Quellen, die mit Hilfe von ReSharper dekompiliert wurden, beide Klassen von der Basisklasse HubBase erben. Der Abschnitt Vererbungshierarchie der MSDN-Seite zeigt die Hub Klasse von Object vererben und IHub und IDisposable Schnittstellen Implementierung jedoch die dekompilierten Quellen offenbaren die oben genannten HubBase Basisklasse, die Umsetzung der IHub Schnittstelle, die wiederum IDisposable implementiert.Wie generische Hub in SignalR zu verwenden

Die Differenz zwischen der Nicht-Generika und Generika Variante der Klassen ist, dass der nicht-generic jemandes Clients Eigenschaft gibt IHubCallerConnectionContext<dynamic> während die generische Variante kehrt IHubCallerConnectionContext<T> eingegeben hat.

Ich möchte meine Clients eingegeben haben, also wenn ich die Client-Methoden vom Hub aufrufen, würde ich richtige Intellisense-Unterstützung und stark typisierte Argumente haben. Was ich jedoch damit zu tun habe, ist, wie ich dem Hub mitteilen kann, dass die Methode meines Client-Modells tatsächlich im Browser aufgerufen werden soll.

Das ist meine TestModel Klasse ist:

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

Mit dem nicht-generic-Hub, würde ich rufe Sie einfach .Notify() oder .Notify(new TestModel() { Name = "sth" }) am dynamic ly gebunden this.Context.Clients.Client(…) oder this.Context.Caller, aber mit der allgemeinen Klasse, wenn ich rufe Bei diesen leeren Methoden wird der Browser in ähnlicher Weise überhaupt nicht benachrichtigt.

Wie verwenden Sie die generische Hub-Klasse so, wie sie verwendet werden soll?

+0

könnte dies nützlich sein: http://stackoverflow.com/a/21763587/526704 – DLeh

+0

Ich fürchte, die Frage nichts zu tun hat. Ich bin daran interessiert, Client-Methoden vom Server aufzurufen, nicht umgekehrt, was das OP dieser Frage tut und die Methoden, die ich mit RPC aufrufen möchte, sind nicht generisch, der Hub ist es aber, und so ist es auch Kunden. Ich schätze den Kommentar jedoch. –

+0

Ich war mir nicht sicher, ob es hilfreich wäre oder nicht, aber ich dachte, ich würde liefern, was ich gefunden habe. Entschuldigung, ich habe keinen anderen nützlichen Einblick :( – DLeh

Antwort

8

Ich habe die Antwort gefunden. Die MSDN-Dokumentation ist nicht up-to-date, als der noch, aber die ASP .NET-Website bietet schöne SignalR Tutorials und einer von ihnen deckt die typisierte Naben:

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

Wie das Beispiel in dem Artikel zeigt, Wenn Sie eine Schnittstelle für das Argument type verwenden, funktioniert alles und Sie erhalten stark typisierte Hub-Clients, deren Methoden korrekt in RPC s übersetzt sind. Hier ist ein Stück Code Getestet habe ich diese mit:

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

Denken Sie daran, dass, um die 'OnConnected' Methode aufgerufen werden, müssen Sie ein registrieren Client Methode zuerst: '$ .connection.testHub.client.sayHello = function (g) {...}'. Es ist von Entwurf, dass der Client, der nicht aufgerufen werden kann, nicht die 'On [Connected | Reconnected | Disconnected]' -Methoden auslöst und nur die Hub-Methoden ähnlich dem Request-Response-Paradigma aufrufen kann. –

Verwandte Themen