我可以看到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客户端在Connection或HubConnection上添加标头(如@abnanda所述:
var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");
在服务器端,您可以从IRequest中检索标头值,例如OnConnected:
var header = request.Headers["custom-header"];
但是,我还没有找到使用JS客户端执行此操作的方法($ connection对象上没有标题或addHeaders)。
我在[http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+]上发布了一个问题
编辑:标头不公开,因为websocket客户端(在浏览器中)不支持它(因此不可能跨传输实现它)。请参阅上方帖子中的David Fowlers回复。
我通过将信息添加到querystring
来解决此问题,该信息可在IConnected.Connect()
方法上找到。
使用js客户端,我认为不支持该标头,但必须通过querysting进行。
using Microsoft.AspNet.SignalR.Client;
HubConnection = new HubConnection(_url);
HubProxy = HubConnection.CreateHubProxy(_hubname);
HubConnection.Headers.Add("Authorization", "Bearer "+authToken);
HubConnection .Start().Wait();
大家好,这是.Net客户端的最佳方法!