2012-05-18 4 views
7

Tôi đang xem SignalR cho một dự án tôi đang làm việc trên, và nó có vẻ là chính xác những gì tôi muốn. Tuy nhiên một chút mà tôi vẫn còn một chút bối rối bởi là các nhóm và tham gia.SignalR and Joining Groups

Tôi sẽ cố gắng mô tả bối cảnh triển khai trước tiên. Vì vậy, một người dùng trong một hệ thống hiện có sẽ muốn tổ chức một cuộc họp về một chủ đề cụ thể và sau đó sẽ tạo một căn phòng với một tên/mã định danh cụ thể, sau đó họ sẽ mời người khác vào nó và về cơ bản sẽ giống như một phòng chat riêng. Vì vậy, các bước tôi giả định sẽ là máy chủ, tạo một phòng và tham gia nó, và sau đó gửi lời mời mà sẽ yêu cầu người dùng nhấp vào mà bằng cách nào đó sẽ nói cho máy chủ mà phòng để tham gia vào.

Bây giờ tôi thấy từ tài liệu có phương thức Tham gia và Ngắt kết nối mà bạn có thể móc vào để đưa người nào đó vào nhóm, tuy nhiên có vẻ như Tham gia không có ngữ cảnh liên kết với nó ngoài chuỗi truy vấn. có một chút nhầm lẫn về những gì kích hoạt một Join, như tôi mong đợi nó sẽ là một phương thức được kích hoạt bằng tay trên client truyền qua một số đối tượng cho bối cảnh như những gì để đặt chúng vào, vì bạn có thể có hàng trăm phòng riêng. Vì vậy, làm thế nào để bạn cung cấp cho các phương pháp tham gia một số bối cảnh, và ngắt kết nối một, vì vậy họ biết phòng bạn đang yêu cầu tham gia, như thể nó không được kích hoạt bằng tay như thế nào bạn có thể thiết lập chuỗi truy vấn, và nếu nó được tự kích hoạt tại sao bạn không thể gửi qua một đối tượng tùy chỉnh. tức là

public Task Join() 
{ 
    var groupName = Context.QueryString["some-room-identifier"]; 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

vs

public Task Join(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

Vì vậy, tôi thiếu một cái gì đó hoặc là có một số cách để cung cấp bối cảnh cho một người dùng tham gia để đặt chúng ở nơi lần đầu tiên phải không?

Trả lời

8

Tôi đã có khá nhiều kinh nghiệm giống như bạn và có loại công việc/chiến đấu theo cách của tôi thông qua nó, vì vậy tôi sẽ chia sẻ những gì tôi đã làm.

Bạn cần chụp trạng thái ở đâu đó. Kiểm tra các Trung tâm SignalR wiki https://github.com/SignalR/SignalR/wiki/Hubs dưới Roundtripping từ khách hàng đến máy chủ. Tôi thấy hữu ích khi nó cho bạn biết cách đặt trạng thái trên hub máy chủ hoặc máy khách và lấy nó ở đầu kia.

Tôi đã kết luận giống như bạn, rằng Tham gia được kích hoạt theo cách thủ công bởi một số sự kiện. Tôi đang sử dụng cuộc thăm dò ý kiến ​​để xem có ai đã yêu cầu trò chuyện với người dùng hay không. Bạn thực sự có thể đẩy từ máy chủ (xem SignalR Join Group From Controller), có nghĩa là hành động điều khiển để xử lý thêm một tin nhắn trò chuyện mới có thể gọi phương thức Join của trung tâm:

// join chatroom 
public Task Join(dynamic mygroup) 
{ 
var groupName = groupy.GetGroupName(parent.userId, (int)mygroup.userIdTo); 
return Groups.Add(Context.ConnectionId, groupName); 
} 

Đối với tên nhóm của tôi, tôi sử dụng một Singleton để tạo và theo dõi tên bằng cách sử dụng Dictionary<string, int[]> (số int[] dành cho userIds).

Đối với công cụ nhà nước của khách hàng, tôi đã kết thúc việc tạo đối tượng JavaScript tùy chỉnh quản lý tên nhóm, như thế này ...

Chat.Chatgroup = function (groupId, userIdTo) { 
this.GroupId = groupId; // our group's title/id 
this.UserIdTo = userIdTo; // who the other user is 
} 

Sau đó, tôi gọi phương thức signalR sau khi kết nối

onechat.getOurGroup(mygroup) // invoke method on server 
.done(function (response) { 
mygroup = response; 
/* + whatever else you need to do*/ }); 

Bây giờ bạn có thể thiết lập một trạng thái trên máy chủ và giữ trạng thái đó trên máy khách:

public dynamic GetOurGroup(dynamic mygroup) 
{ 
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo); 
mygroup.GroupId = ourId;      
return mygroup; 
} 

Hy vọng đó là ít nhất mơ hồ hữu ích!

+0

Cảm ơn tất cả các công cụ hữu ích, tôi sẽ không đặt nó làm câu trả lời cho thời điểm này nhưng sẽ cung cấp cho bạn một phiếu bầu cho tính hữu dụng. Hy vọng nhiều người sẽ kêu vang theo thời gian. – Grofit

+0

Vâng, đó là nội dung mới, khi chúng tôi tìm hiểu, chúng tôi sẽ tinh chỉnh – testpattern

+0

+1. Tôi nghĩ rằng đây là cách duy nhất để đi với cho rằng SignalR không cung cấp một API trả về một tên nhóm được đưa ra một ID kết nối. – GETah