Я вижу, что в HubConnection есть опция для передачи параметров по запросу url от клиента. Есть ли способ передать конкретный токен через HTTP-заголовки из JS или .NET-клиентов?
Передача токена через http Headers SignalR
Ответ 1
Невозможно установить HTTP-заголовки для запросов SignalR с использованием клиента JS или .NET, но вы можете добавить параметры в строку запроса, которая будет отправлена как часть каждого запроса SignalR:
JS Client
$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });
Клиент .NET
var connection = new HubConnection("http://foo/",
new Dictionary<string, string>
{
{ "token", tokenValue }
});
Внутри концентратора вы можете получить доступ к имени сообщества через контекст:
Context.QueryString["token"]
Вы также можете добавить строку запроса при создании постоянных подключений.
EDIT: теперь можно настроить заголовки на клиентском компьютере .NET SignalR, как указано некоторыми комментаторами.
Настройка заголовков в .NET Client
var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
Ответ 2
Вы можете добавлять заголовки в Connection или HubConnection с помощью .NET client (как упоминает @abnanda):
var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");
На стороне сервера вы можете получить значение заголовка из IRequest, например. OnConnected:
var header = request.Headers["custom-header"];
Однако я еще не нашел способ сделать это с помощью JS-клиента (нет заголовков или addHeaders в объекте $connection).
Я опубликовал вопрос по этому поводу: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+
EDIT: Заголовки не отображаются, так как клиент websocket (в браузере) не поддерживает его (поэтому реализовать его через транспорты невозможно). См. Ответ Дэвида Фаулера в сообщении выше.
Ответ 3
Я решил это, добавив свою информацию в querystring
, который доступен по методу IConnected.Connect()
.
В .NET-клиенте вы передаете querystring into your HubConnection:
var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");
На клиенте JS вы устанавливаете свойство qs перед запуском соединения:
$.connection.hub.qs = "myInfo=12345";
Затем вы можете получить доступ к этой информации на сервере в методе Connect():
var myInfo = Context.QueryString["myInfo"];
Groups.Add(Context.ConnectionId, myInfo);