2013-03-20 9 views

Odpowiedz

49

Nie ma łatwy sposób ustawić nagłówki HTTP dla żądania SignalR użyciu klienta JS lub .NET, ale można dodać parametry ciągu kwerendy, która zostanie wysłana w ramach każdego wniosku SignalR:

JS klient

$.connection.hub.qs = { "token" : tokenValue }; 
$.connection.hub.start().done(function() { /* ... */ }); 

NET klient

var connection = new HubConnection("http://foo/", 
            new Dictionary<string, string> 
            { 
             { "token", tokenValue } 
            }); 

Wewnątrz Hub można uzyskać dostęp do nazwy grupy poprzez kontekst:

Context.QueryString["token"] 

Można dodać do ciągu kwerendy podczas wykonywania trwałych połączeń, jak również.

EDYCJA: Teraz można ustawić nagłówki na kliencie .NET SignalR, na co zwracają uwagę niektórzy komentatorzy.

Ustawianie Nagłówki na kliencie .NET

var connection = new HubConnection("http://foo/"); 
connection.Headers.Add("token", tokenValue); 
+0

Dzięki!Tak, wydaje się, że w tej chwili jedynym sposobem jest przekazanie dodatkowych parametrów do połączenia. –

+4

Najnowsza wersja SignalR 1.1.0beta obsługuje nagłówki ustawień. Możesz pobrać najnowsze pakiety z NuGet. –

+0

Nie mogę znaleźć żadnej dokumentacji, jak właściwie ustawić nagłówek. Czy możesz wskazać mi jakiś kierunek? –

12

Możesz dodać nagłówki na każdej połączenie lub HubConnection używając .NET klienta (jak @abnanda wskazań):

var connection = new Connection("http://signalr/"); 
connection.Headers.Add("custom-header", "value"); 

Po stronie serwera można pobrać wartość nagłówkową z IRequest w eg OnConnected:

var header = request.Headers["custom-header"]; 

Jednak jeszcze nie znalazłem sposób, aby to zrobić z JS klienta (nie ma nagłówków lub addHeaders na obiekt połączenia $).

Pisałem pytanie na tej stronie: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+

EDIT: nagłówki nie są narażone od klienta websocket (w przeglądarce) nie obsługuje (więc nie byłoby możliwe do wdrożenia go w poprzek transportów) . Zobacz odpowiedź Davida Fowlersa w poście powyżej.

3

Rozwiązałem to, dodając moje informacje do querystring, które są dostępne w metodzie IConnected.Connect().

Na kliencie .NET zdać querystring into your HubConnection:

var connection = new HubConnection("http://localhost:8080/", "myInfo=12345"); 

Na kliencie JS ustawić właściwość qs przed rozpoczęciem połączenia:

$.connection.hub.qs = "myInfo=12345"; 

Następnie można uzyskać dostęp do tych informacji na serwerze w metodzie Connect():

var myInfo = Context.QueryString["myInfo"]; 
Groups.Add(Context.ConnectionId, myInfo); 
+0

Inteligentna sztuczka. Właśnie uratowałeś moje życie. Dziękuję Ci – Jacob