HubConnectionには、クライアントからのURLリクエストを介してパラメーターを渡すオプションがあることがわかります。 JSまたは.NETクライアントからhttpヘッダーを介して特定のトークンを渡す方法はありますか?
JSまたは.NETクライアントを使用してSignalR要求のHTTPヘッダーを設定する簡単な方法はありませんが、各SignalR要求の一部として送信されるクエリ文字列にパラメーターを追加できます。
JSクライアント
$.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"]
永続的な接続を行うときにもクエリ文字列に追加できます。
編集:いくつかのコメンターが指摘したように、.NET SignalRクライアントにヘッダーを設定できるようになりました。
。NETクライアントでのヘッダーの設定
var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);
。NET clientを使用して、ConnectionまたはHubConnectionのいずれかにヘッダーを追加できます(@abnandaの言及どおり):
var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");
サーバー側では、IRequestからヘッダー値を取得できます。 OnConnected:
var header = request.Headers["custom-header"];
ただし、JS clientでこれを行う方法はまだ見つかりません($ connectionオブジェクトにヘッダーまたはaddHeadersはありません)。
私はその上に質問を投稿しました: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR + 1 + 1 + 1 + 1 +
編集:(ブラウザ内の)websocketクライアントはそれをサポートしていないため、ヘッダーは公開されていません(したがって、トランスポート間で実装することはできません)。上記の投稿のDavid Fowlersの回答をご覧ください。
IConnected.Connect()
メソッドで利用可能なquerystring
に情報を追加することでこれを解決しました。
.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);
Jsクライアントでは、ヘッダーはサポートされていないと思いますが、代わりにquerystingを経由する必要があります。
生成されたjsプロキシではないJavaScriptクライアントの場合、次のようにクエリ文字列に追加情報を追加できます。
var connection = $.hubConnection("http://localhost:3306/signalr");
connection.qs = "somekey=somevalue";
var hubProxy = connection.createHubProxy('hubname');
Ping、negotiate、abort、connectなどのメッセージには、このクエリ文字列値が含まれるようになりました。
Ajaxグローバル設定に影響する場合、ヘッダーを送信できます。私はそれがサーバーに到達するのを観察しましたが、あなたが必要とするかもしれないあらゆる場合にそれが成功することをテストしていません。
$.ajaxSetup({
beforeSend: function (xhr)
{
xhr.setRequestHeader("Authorization","Token token=\"abcdef\"");
}
});
using Microsoft.AspNet.SignalR.Client;
HubConnection = new HubConnection(_url);
HubProxy = HubConnection.CreateHubProxy(_hubname);
HubConnection.Headers.Add("Authorization", "Bearer "+authToken);
HubConnection .Start().Wait();