2012-04-06 4 views
3

Ich habe ein wirklich seltsames Problem mit MVC3 und Signalgeber .. Ich habe einen einfachen Hub;SignalR in MVC3, Timing und Start/Verbindungsprobleme?

[HubName("test")] 
public class Test: Hub 
{ 
    public object GetStuff() 
    { 
     return new { dummy = "Test" }; 
    } 
} 

Und einige clientseitige Code;

var connection = $.connection.test; 
connection.start(); 
connection.getStuff(); 

Dies löst einen Fehler aus;

Typeerror: Objekt hat keine Methode 'start'

Wenn ich stattdessen tun

var connection = $.connection("test"); 

ich einen anderen Fehler zu bekommen;

Typeerror: Objekt hat keine Methode 'getStuff' jquery-1.6.4.min.js: 4

POST http://localhost:63021/Controller/test/negotiate 405 (Methode nicht erlaubt)

Hinweis seine versuchen, zu verhandeln unter dem Controller aus irgendeinem Grund?

Gibt es eine bestimmte Route, die ich registrieren muss? Eine andere Magie, von der ich nichts weiß?

UPDATE So ein bisschen mit Konsole zu spielen - die erste Version in der Tat nicht ein Objekt erstellen, die getStuff hat(), die ich anrufen kann. Aber der Signalgeber gibt auf, weil ich zuerst start() aufrufen muss - was nicht existiert! Der zweite erzeugt ein Objekt, das Anfang hat(), aber es funktioniert nicht getStuff() haben ..

UPDATE 2 .connection.hub.start statt $ Versuchte zu tun. Dies scheint in der Konsole zu funktionieren, aber nicht in der Seite onload. Möglicherweise ist der Start nicht beendet, bevor der Hub-Aufruf erfolgt? Ist es asynchron?

+0

nicht sicher sagen kann - aber es könnte Groß- und Kleinschreibung 'getStuff' vs.' GetStuff' für Ihren zweiten Fall sein. – vcsjones

+0

Keine funktioniert, und die Verhandlungsurl gibt eine 404 zurück, wie es nicht existieren kann (Hubs sind am Stamm). – XeroxDucati

Antwort

7

Starten der SignalR-Verbindung ist nicht sofort. Ein Anruf an connection.GetStuff(); kann fehlschlagen, wenn die Verbindung noch nicht hergestellt wurde. Wenn Sie möchten, dass dieser Code ausgeführt wird, nachdem eine Verbindung mit dem Hub hergestellt wurde, sollten Sie eine Rückruffunktion verwenden.

var connection = $.connection.test; 
$.connection.hub.start(function(){   
    // By convention all exposed hub methods start with lowercase 
    connection.getStuff(); 
}); 

Hub Schnellstart: https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs

In eingehenden Blick auf SignalR javascript client: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs

+0

Versucht dies auch - und setzen Sie einen Timer im Code. Es ist die start() -Methode, die das langsam ist. Gleicher exakter Code aber in Webforms anstelle von mvc verbindet sich in 0,2 Sekunden.Unter MVC, 3-5 Sekunden .. ein Konflikt auf der MVC-Seite vielleicht? – XeroxDucati

0

starten:

var connection = $ .connection ("@ Url.Content (" ~/echo ")");

1

Sie müssen den Nabenteil hinzufügen:

$.connection.hub.start();