2012-03-07 61 views
18

我希望能夠讓各個用戶使用SignalR互相發送消息,因此我需要發送到特定的客戶端ID。我如何在會話開始時爲特定用戶定義客戶端ID - 說出用戶的GUID主鍵?SignalR - 手動設置ClientID

回答

23

用您自己的https://github.com/SignalR/SignalR/wiki/Extensibility替換IConnectionIdFactory。

使用範例: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

編輯:這不再SignalR的最新版本支持。但是,你可以定義一個用戶ID使用新IUserIdProvider的特定連接

+0

非常好 - 感謝您的回覆和博客鏈接! – reach4thelasers 2012-03-08 09:39:31

+2

有沒有辦法在不使用cookies的情況下手動設置客戶端ID?也許是start()方法的一個參數,或者是將信息傳遞給自定義連接工廠中的請求對象的另一種方法? – 2012-03-08 15:48:25

+1

感謝您鏈接到我的博客! – 1kevgriff 2012-03-08 16:30:19

3

的SignalR Client Side documentation概述如下:

connection.id - 獲取或設置客戶端ID爲當前連接

這當然表明應該能夠設置clientID客戶端,沒有所有上述管道。這不工作?如果工作,這行代碼將如何?

+0

我還沒有嘗試過,但我需要能夠將連接ID​​分配給服務器已知的某些內容,例如GUID(用戶ID),因此IConnectionFactory解決方案對我來說最適合。 – reach4thelasers 2012-04-24 13:38:29

+0

+1雖然提高它 – reach4thelasers 2012-04-24 13:38:48

5

在使用集線器方法的SignalR版本1中,我重寫了Hub OnConnected()方法,並將.NET成員資格userId與當前連接標識(Context.ConnectionId)關聯保存在SQL數據庫中。

然後我重寫Hub OnDisconnected()方法並刪除.NET成員資格userId和當前連接ID之間的關聯。這意味着在頁面上重新加載userId/connectionId關聯將是最新的。

東西線沿線的:

public class MyHub : Hub 
{ 
    private MembershipUser _user 
    { 
     get { return Membership.GetUser(); } 
    } 

    private Guid _userId 
    { 
     get { return (Guid) _user.ProviderUserKey; } 
    } 

    private Guid _connectionId 
    { 
     get { return Guid.Parse(Context.ConnectionId); } 
    } 

    public override Task OnConnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Create(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Delete(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnDisconnected(); 
    } 
} 

然後,當我需要觸發特定用戶SignalR事件,我可以從數據庫協會(S)與當前的用戶id制定出的ConnectionId - 有如果涉及多個瀏覽器實例,則可能會多於一個關聯。

+0

你有這樣的例子嗎? – CR41G14 2013-03-11 09:31:41

+0

我已經用示例更新了我的答案 – 2013-03-11 11:59:59