Trong bài viết hôm nay mình sẽ cùng nhau tìm hiểu về cách làm việc hay vận hành khi lập trình với thời gian thực (realtime) bằng cách sử dụng SignalR trong .NET Core.
SignalR là gì?
SignalR Hubs API cho phép bạn gọi các phương thức trên client được kết nối từ server. Tức là, trong code ở server, bạn định nghĩa ra các phương để client gọi và dùng. Và trên code ở client, bạn gọi lại các phương thức được định nghĩa từ server. Và SignalR được sinh ra để xử lý mọi thứ giúp cho client và server giao tiếp với nhau theo thời gian thực.
Real-time là gì? Đó là khả năng server đẩy những nội dung tới client đã được kết nối một cách tức thì. Nó khác với giao thức HTTP thông thường: server đợi những yêu cầu từ client và trả về nội dung tương ứng.
SignalR xử lý quản lý kết nối một cách tự động, và cho bạn truyền đi thông điệp tới tất cả các client đã được kết nối một cách đồng loạt. Bạn cũng có thể gửi những thông điệp tới những client được xác định. Kết nối giữa client và server là liên tục, không giống như kết nối HTTP cổ điển, cái mà sẽ thành lập lại kết nối cho mỗi lần giao tiếp.
Ví dụ ta các ứng dụng sau sử dụng SignalR:
- Chat app giống Facebook Messenger, Zalo,...
- Chức năng thông báo đẩy như trong mạng xã hội.
- Live dashboards, ví dụ như KPI dashboards, hiển thị ngay lập tức sau khi cập nhật thông tin bán hàng.
- Các meeting room, nơi diễn ra các cuộc họp, bàn luận, tức là khi một ai đó join vào sẽ đẩy vào room ngay lập tức chứ không thực hiện reload.
Để xử lý giao tiếp thời gian thực, SignalR hỗ trợ:
- WebSockets
- Server-Sent Events (các event từ máy chủ gửi đến)
- Long Polling
Hubs
Hub là một high-level đã xây dựng dựa trên Connection API mà cho phép client và server gọi những methods của nhau một cách trực tiếp.
SignalR tự động xử lý việc điều phối qua các ranh giới máy, cho phép máy khách gọi các phương thức trên máy chủ và ngược lại.
SignalR cung cấp hai hub protocols tích hợp sẵn đó là: một giao thức văn bản dựa trên JSON và một giao thức nhị phân.
Các class Hub cũng có thuộc tính Context chứa các thuộc tính sau, cung cấp thông tin về kết nối, cụ thể bạn có thế xem thêm bên dưới:
- ConnectionAborted
- ConnectionId
- Features
- Items
- User
- UserIdentifier
Tạo và sử dụng SignalR
Ta tiến hành tạo ra các hub bằng cách định nghĩa ra các class kế thừa từ Hub, và Clients có thể gọi các method trong đây. Và lưu ý rằng các class bạn định nghĩa phải public.
Chẳng hạn, ta có ví dụ code sau:
public class ChatHub : Hub
{
public Task SendMessage(string user, string message)
{
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
Context object
Các class Hub có thuộc tính Context chứa các thuộc tính sau với thông tin về kết nối.
Thuộc tính/method | Mô tả |
---|---|
ConnectionId | Nhận ID duy nhất cho kết nối, được chỉ định bởi SignalR. Có một ID kết nối cho mỗi kết nối. |
UserIdentifier | Theo mặc định, SignalR sử dụng ClaimTypes.NameIdentifier từ ClaimsPrincipal với kết nối làm định danh người dùng. |
User | Từ ClaimsPrincipal để lấy người dùng hiện tại. |
Items | Lấy một collection gồm key/value sử dụng để chia sẻ dữ liệu trong phạm vi của kết nối này. |
Features | Nhận bộ sưu tập các tính năng có sẵn trên kết nối. |
ConnectionAborted | Nhận một thông báo CancellationToken khi kết nối bị hủy bỏ. |
GetHttpContext | Đây là một method trả về một HttpContext cho mỗi connection, hoặc null nếu kết nối không được liên kết với một yêu cầu HTTP. |
Abort | Phương thức dùng để hủy kết nối. |
Client Object
Trước hết, ta có các thuộc tính sau đây:
Thuộc tính | Mô tả |
---|---|
All | Gọi một phương thức trên tất cả client đã được kết nối |
Caller | Theo mặc định, SignalR sử dụng ClaimTypes.NameIdentifier từ ClaimsPrincipal với kết nối làm định danh người dùng. |
Others | Gọi một phương thức trên tất cả client được kết nối ngoại trừ các client đã gọi phương thức |
Và các phương thức sau:
Phương thức | Mô tả |
---|---|
AllExcept | Gọi một phương thức trên tất cả các máy khách được kết nối ngoại trừ các kết nối được chỉ định |
Client | Gọi một phương thức trên một ứng dụng khách được kết nối cụ thể |
Clients | Gọi một phương thức trên các máy khách được kết nối cụ thể |
Group | Gọi một phương thức trên tất cả các kết nối trong nhóm được chỉ định |
GroupExcept | Gọi một phương thức trên tất cả các kết nối trong nhóm được chỉ định, ngoại trừ các kết nối được chỉ định |
Groups | Gọi một phương thức trên nhiều nhóm kết nối |
OthersInGroup | Gọi một phương thức trên một nhóm kết nối, ngoại trừ ứng dụng khách đã gọi phương thức trung tâm |
User | Gọi một phương thức trên tất cả các kết nối được liên kết với một người dùng cụ thể |
Users | Gọi một phương thức trên tất cả các kết nối được liên kết với những người dùng được chỉ định |
Send messages đến clients
Ở đây có 3 ví dụ với Hub method để gửi messages đến clients.
public Task SendMessage(string user, string message)
{
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
public Task SendMessageToCaller(string user, string message)
{
return Clients.Caller.SendAsync("ReceiveMessage", user, message);
}
public Task SendMessageToGroup(string user, string message)
{
return Clients.Group("SignalR Users").SendAsync("ReceiveMessage", user, message);
}
- SendMessage dùng để gửi tin nhắn đến tất cả các máy khách được kết nối bằng cách sử dụng
- Clients.All.SendMessageToCaller dùng để gửi tin nhắn lại cho người gọi bằng cách sử dụng
- Clients.Caller. SendMessageToGroup gửi một tin nhắn cho tất cả các clients trong một nhóm SignalR Users.
Lời kết
Việc tiếp cận SignalR mới người bắt đầu rất có nhiều vấn đề để tìm hiểu và quan tâm thêm. Để trực quan hơn cho việc tìm hiểu realtime này, trong bài viết sắp tới mình sẽ tìm hiểu bằng việc triển khai project cụ thể.
Mong bài viết hữu ích đến các bạn. Chúc các bạn thành công.
Hieu Ho.
Hay quá ạ
Trả lờiXóa