2013-03-20 53 views

回答

49

有没有简单的方法来设置使用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); 
+0

谢谢!是的,它似乎是目前唯一的方式来传递额外的参数。 – 2013-03-21 10:00:43

+4

SignalR 1.1.0beta的最新版本支持设置标题。你可以从NuGet获得最新的软件包。 – 2013-04-12 00:11:37

+0

我似乎无法找到任何有关如何真正设置标题的文档。你能指出我的方向吗? – 2013-05-27 13:14:58

12

您可以使用.NET客户端(如@abnanda提到)或者连接或HubConnection添加页眉:

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

在服务器端,您可以从例如IRequest中检索标题值OnConnected:

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

不过,我还没有找到一种方法,与JS客户做到这一点(存在$连接对象没有页眉或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回复。

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); 
+0

聪明的把戏。你现在救了我的命。谢谢 – Jacob 2017-08-18 09:24:52