2013-04-17 12 views
15

Ich habe ein Problem mit SignalR JS Client Hub.Das On-Ereignis auf dem SignalR-Client-Hub wird nicht aufgerufen

Das Problem ist, dass der 'on' Handler scheint nicht zu funktionieren - es erzeugt keinen Fehler, aber keine Signale vom Server gesendet. Der folgende Code zeigt einen Auszug, wo ich den Server (mit dem Aufruf) anruft, was gut funktioniert - dann auf dem Server rufe ich acceptHubData zurück, die auf dem Client abgeholt werden sollte, aber nicht ist.

Mein Ziel ist beim Navigieren zu Seiten, dass jede Seite eine Verbindung zu einem bestimmten Hub öffnet und diese Verbindung freigibt, wenn der Benutzer auf eine andere Seite bewegt !!

EDIT: mit dem folgenden Code-Snippet funktioniert, aber ich frage mich, warum der Code weiter unten mit dem 'on' Ereignis nicht funktioniert!

Jede Hilfe wäre sehr willkommen!

Dieser der Client-Code (in js)

$(document).ready(function() { 

    var myHub; 

    try { 

     var connection = $.hubConnection(); 

     connection.start().done(function() { 

      myHub = connection.createHubProxy("mySuperHub"); 

      myHub.on('acceptHubData', function (data) { 
       alert(data); // THIS IS NOT CALLED! 
      }); 

      myHub.invoke('AcceptSignal', "hello from the client2"); 

     }); 

    } 
    catch (e) { 
     alert(e.message); 
    } 
}); 

Dies ist der Server-Code:

[HubName("mySuperHub")] 
public class MyHub : Hub 
{ 

    private readonly HubEngine _hubEngine; 

    public MyHub() : this(HubEngine.Instance) { } 

    public MyHub(HubEngine hubEngine) 
    { 
     _hubEngine = hubEngine; 
    } 

    public void AcceptSignal(string msg) 
    { 
     Clients.Caller.acceptHubData("hi"); 
     Clients.All.acceptHubData("hi"); 
    } 

} 
+0

Siehe http://stackoverflow.com/a/42527962/1770868 –

Antwort

40

Sie können weiterhin die on Methode verwenden, um Ereignisse für JS-Client-Hub-Methode ruft in der neuesten Version von SignalR hinzuzufügen, aber wenn Sie ein hubProxy keine Event-Listener nicht hinzufügen, bevor hubConnection.start() aufrufen, werden Sie nicht abonniert werden zum Hub. SignalR abonniert die Hubs, für die Sie Event-Handler haben, wenn die hubConnection startet. Wenn Sie Ihren Hub nicht abonniert haben, funktioniert das Hinzufügen von Ereignissen zu diesem Hub nach start() nicht.

Wenn Sie dem Hub vor start() mindestens einen Ereignis-Listener hinzufügen, können Sie nach dem Start() und dem Befehl auch weitere Event-Handler hinzufügen, die Sie dem Hub hinzufügen möchten, indem Sie on verwenden Handler werden angerufen.

Es spielt keine Rolle, ob Sie ein Ereignis hinzufügen, indem hubProxy.on('eventName', function (... oder autogeneratedHubProxy.client.eventName = function (... bevor Sie start() nennen, aber nur on erfolgreich Ereignis-Listener hinzufügen, nachdem start() genannt wird.

+1

Fantastisch - das funktioniert in der Tat - hätte ich nicht gedacht! Ich habe es getestet, indem ich ein nicht existierendes Ereignis hinzugefügt habe und das funktioniert auch! Danke – Marcel

+0

Mann, ich riss mir die Haare aus (was ich noch hatte) und versuchte herauszufinden, was ich falsch gemacht hatte.Es schien rückwärts zu gehen, bevor Sie den Start anriefen, aber anscheinend müssen Sie das tun. FYI - Ich benutzte die 'on()' Methode und es würde nicht funktionieren, wenn ich nach 'start()' abonnieren würde. – Zach

+0

Danke, es hat funktioniert. –

1

Nicht sicher, welche Version von SignalR Sie verwenden, aber ich habe mehr Erfolg hatte mit die folgende Syntax auf meinem Server:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.acceptHubData("hello");  

und auf meinen Kunden:

myHub.client.acceptHubData = function (data) { 
    console.log(data); 
} 
+0

danke für die Antwort - das funktioniert in der Tat - Ich würde gerne verstehen, warum das 'on' Event-Prinzip nicht funktioniert - siehe meine Bearbeitung! – Marcel

+0

Möglicherweise suchen Sie in der Dokumentation nach einer älteren Version des Signalgebers. Sicher, das ist der Ansatz, der in der Dokumentation hier empfohlen wird: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs – paul

+0

Ich schaute auf dieses https://github.com/SignalR/ SignalR/wiki/SignalR-JS-Client-Hubs-% 28No-Proxy% 29 – Marcel