2012-11-02 8 views
8

Ich entwickle eine Benutzer-Tracking-Lösung mit SignalR, als ein lustiges Projekt SignalR lernen, für ASP.NET MVC-Anwendungen.Holen Sie sich die vollständige URL in SignalR Hub

Derzeit kann ich protokollierte Benutzer verfolgen und wie lange sie auf einer bestimmten Seite sind. Wenn sie auf eine andere Seite wechseln, verfolge ich das auch und der Timer, den SignalR aktualisiert, wird zurückgesetzt ... Viele andere Funktionen sind implementiert oder teilweise implementiert.

Das Problem, das ich gegenüberstelle, ist, wie man die volle URL Controller/Aktion/Parameter in SignalR Hub?

Wenn ich HttpContext.Current.Request.Url verwende, ist die URL immer /signaler/connect.

HINWEIS:

var hub = $.connection.myHub; 
$.connection.hub.start(); 

im _Layout.cshtml.

UPDATE:

Ich habe versucht,

var location = '@HttpContext.Current.Request.Url'; 
var hub = $.connection.myHub; 
$.connection.hub.start().done(function() { 
    hub.setLocation(location); 
}); 

zu verwenden, und die Lage ist korrekt übergeben, aber ich muss es auf der Connect() Aufgabe nicht später. Ist es möglich, dies zu tun?

UPDATE 2:

Dieser Ansatz nicht

var hub = $.connection.myHub; 
$.connection.hub.start(function(){hub.setLocation(location)}); 

als Connect() wird, bevor genannt funktioniert.

In meinem Hub habe ich mehrere Methoden, aber ich würde gerne einen Wert (in meinem Fall ein Ort) an die Connect() übergeben, ist das möglich?

public class MyHub : Hub, IDisconnect, IConnected 
{ 
    public Task Connect() 
    { 
     //do stuff here 
     //and i would like to have the **location** value 
    } 

    public Task Disconnect() 
    { 
     //do stuff here    
    }    
} 

Update 3

Verwenden Abfragezeichenfolge Daten zu übergeben, bevor die Connect() auftritt.

var location = '@HttpContext.Current.Request.Url'; 

var hub = $.connection.myHub; 
$.connection.hub.qs = "location= + location; 
$.connection.hub.start(); 
+0

hallo ... arbeiten Sie immer noch auf dieser Tracking-Lösung ... tun Sie seinen Code etwas dagegen zu teilen? –

+0

@jalchr Ich habe nichts dagegen, aber die NDA würde; (Ich werde freundlich helfen/zeigen in die richtige Richtung, wenn Sie Fragen haben. –

+0

Tipp: für die Benutzerverfolgung müssen Sie sicherstellen, SignalR verbindet unmittelbar bevor die Seite alle voll geladen hat Ressourcen: 'waitForPageLoad' also stellen Sie sicher, dass Sie das setzen: http://StackOverflow.com/Questions/32856436/SignalR-SLow-to-Connect-from-JavaScript-client/32856492#32856492 –

Antwort

4

Daten wie Ihr Standort Wert Passing Connect() ist möglich über einen Abfragezeichenfolgeflag Parameter: SignalR: How to send data to IConnected.Connect()

+0

Danke.Ich weiß wirklich nicht, wie Google oder Stackoverflow Vorschläge di führe mich nicht zu deiner Antwort. –

1

Sie könnten es von Ihrem Client js Anruf an Ihren Hub als Parameter übergeben.

+0

Vielen Dank für Ihre Antwort habe die Frage aktualisiert Irgendwelche Lösung für dieses Problem? –

+0

kann man es nicht in start() einfügen, ist das früh genug. zB hub.start (funcoint() {hub.setLocation (location);}) anstatt done – dove

+0

Connect() Aufgabe, ich bin nicht klar, wenn Sie genau damit meinen. – dove

1

Abfragezeichenfolgeflag Verwendung nicht sehr sicher ist, einen Hacker kann dazu führen, JS Code schmiedet und Ihnen falsche Stelle Bruch was auch immer Logik senden du hast es hinter dir.

können Sie versuchen, diese von

owin-enviromment Variablen zu erhalten

var underlyingHttpContext = Context.Request.Environment[typeof(HttpContextBase).FullName] as HttpContextBase;

Dann extrahieren, was Sie brauchen.

Es wird auf IIS arbeiten, für Nicht-IIS-Hosting-Look für andere OWIN Sachen https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys