© 2020, Developed by Hieu Dev

Giới thiệu về Realtime với SignalR trong .NET Core

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.

Giới thiệu về Realtime với 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.

1 Nhận xét

Mới hơn Cũ hơn