2012-03-07 41 views
18

Tôi muốn có thể có người dùng cá nhân gửi tin nhắn cho nhau bằng SignalR, do đó tôi cần gửi đến một ID khách hàng cụ thể. Làm thế nào tôi có thể xác định ID khách hàng cho một người dùng cụ thể vào đầu phiên - nói một khóa chính GUID cho người dùng?SignalR - Đặt ClientID theo cách thủ công

Trả lời

23

Thay thế IConnectionIdFactory bằng https://github.com/SignalR/SignalR/wiki/Extensibility của riêng bạn.

mẫu sử dụng: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

EDIT: Đây không còn được hỗ trợ trong phiên bản mới nhất của SignalR. Nhưng bạn có thể xác định một user id cho một kết nối cụ thể bằng cách sử dụng IUserIdProvider mới

+0

Tuyệt vời - cảm ơn phản hồi và liên kết blog! – reach4thelasers

+2

Có cách nào để đặt ID ứng dụng khách theo cách thủ công mà không sử dụng cookie không? có lẽ một tham số cho phương thức start() hoặc một cách khác để truyền thông tin cho đối tượng yêu cầu trong nhà máy kết nối tùy chỉnh? –

+1

Cảm ơn bạn đã liên kết tới blog của mình! – 1kevgriff

3

Các SignalR Client Side documentation phác thảo như sau:

connection.id - Gets hoặc đặt id khách hàng cho các kết nối hiện

Điều này chắc chắn chỉ ra rằng người ta có thể đặt phía máy khách ClientID, mà không có tất cả các hệ thống ống nước trên. Điều này không hoạt động? Nếu làm việc, dòng mã này sẽ như thế nào?

+0

Tôi đã không thử điều đó, nhưng tôi cần để có thể gán ID kết nối cho một cái gì đó được biết đến với máy chủ như GUID (userid), vì vậy giải pháp IConnectionFactory hoạt động tốt nhất cho tôi. – reach4thelasers

+0

+1 để tăng nó mặc dù – reach4thelasers

5

Trong SignalR phiên bản 1 bằng cách sử dụng phương pháp Hubs, tôi ghi đè lên phương thức Hub OnConnected() và lưu liên kết thành viên .NET userId với id kết nối hiện tại (Context.ConnectionId) trong cơ sở dữ liệu SQL.

Sau đó, tôi ghi đè phương thức Hub OnDisconnected() và xóa liên kết giữa thành viên .NET userId và id kết nối hiện tại. Điều này có nghĩa là một trang tải lại liên kết userId/connectionId sẽ được cập nhật.

cái gì đó dọc theo dòng:

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(); 
    } 
} 

Sau đó, khi tôi cần phải kích hoạt một sự kiện SignalR cho một người dùng cụ thể, tôi có thể làm việc ra các connectionId từ hiệp hội cơ sở dữ liệu (s) với userId hiện tại - có có thể có nhiều hơn một liên kết nếu nhiều phiên bản trình duyệt có liên quan.

+0

Bạn có ví dụ về điều này không? – CR41G14

+0

Tôi đã cập nhật câu trả lời của mình bằng ví dụ –

Các vấn đề liên quan