2012-11-02 15 views
8

Opracowuję rozwiązanie do śledzenia użytkowników za pomocą SignalR, jako zabawny projekt do nauki SignalR dla aplikacji ASP.NET MVC.Uzyskaj pełny adres URL wewnątrz koncentratora SignalR

Obecnie mogę śledzić zalogowanych użytkowników i określić, jak długo są oni na określonej stronie. Jeśli przejdą na inną stronę, śledzę to również i timer, który SignalR aktualizuje, resetuje ... Wiele innych funkcji jest zaimplementowanych lub częściowo wdrożonych.

Problem, jaki napotykam, polega na uzyskaniu pełnego adresu sterownika/działania/parametrów wewnątrz koncentratora SignalR?

Podczas korzystania z adresu HttpContext.Current.Request.Url adres URL to zawsze /signalr/connect.

UWAGA:

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

jest w _Layout.cshtml.

UPDATE:

Próbowałem użyć

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

A lokalizacja jest przekazywana poprawnie, ale muszę go na connect() zadanie nie później. Czy można to zrobić?

UPDATE 2:

Takie podejście nie działa

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

jako Connect() nazywa wcześniej.

W moim hubie mam kilka metod, ale chciałbym przekazać wartość (w moim przypadku lokalizację) do Connect(), czy to możliwe?

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    
    }    
} 

Aktualizacja 3

Zastosowanie QueryString do przekazywania danych przed Connect() występuje.

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

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

cześć ... ty nadal pracuje na tym rozwiązaniu śledzenia ... Czy myśli dzieląc swój kod? –

+0

@jalchr Nie mam nic przeciwko, ale NDA zrobiłaby; (Będę łaskawie pomóc/wskaż we właściwym kierunku, jeśli masz jakieś pytania.) –

+0

wskazówka: aby śledzić użytkowników, musisz się upewnić, że SignalR łączy się bezpośrednio przed pełnym załadowaniem strony zasoby: 'waitForPageLoad', więc upewnij się, że to ustawiłeś: http://stackoverflow.com/questions/32856436/signalr-is-slow-to-connect-from-javascript-client/32856492#32856492 –

Odpowiedz

4

Przekazywanie danych jak twój wartości lokalizacji na connect() jest możliwe poprzez parametr kwerendy: SignalR: How to send data to IConnected.Connect()

+0

Dzięki. Naprawdę nie wiem, jak Google lub Stackoverflow sugestie di nie prowadź mnie do twojej odpowiedzi. –

1

Można przekazać go z połączenia klienta js do swojego koncentratora jako parametr.

+0

Dziękuję za odpowiedź. 've zaktualizował pytanie.Jak jakiekolwiek rozwiązanie tego problemu? –

+0

nie można umieścić go w start(), jest wystarczająco wcześnie, np. hub.start (funcoint() {hub.setLocation (location);}), a nie gotowe – dove

+0

Zadanie Connect() nie jest jasne, kiedy dokładnie to rozumiesz – dove

1

Korzystanie ciągu kwerendy nie jest bardzo bezpieczny, bo haker może fałszować kodu JS i wysłać niewłaściwym miejscu zerwania cokolwiek logika masz za tym.

Można spróbować dostać to od owin-enviromment zmiennych

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

potem wyciągać co trzeba.

Będzie działać na IIS, dla non-IIS hostingu szukać innych rzeczy OWIN https://github.com/aspnet/AspNetKatana/wiki/OWIN-Keys