2013-03-20 106 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