Sự khác biệt giữa SignalR và ASP.NET Core SignalR
ASP.NET Core SignalR không tương thích với các client hoặc server dành cho ASP.NET SignalR. Bài viết này trình bày chi tiết các tính năng đã bị xóa hoặc thay đổi trong ASP.NET Core SignalR.
Cách xác định phiên bản SignalR
| - | ASP.NET SignalR | ASP.NET Core SignalR |
|---|---|---|
| Server NuGet package | Microsoft.AspNet.SignalR | Không có. Được bao gồm trong shared framework Microsoft.AspNetCore.App. |
| Client NuGet packages | Microsoft.AspNet.SignalR.Client Microsoft.AspNet.SignalR.JS | Microsoft.AspNetCore.SignalR.Client |
| JavaScript client npm package | signalr | @microsoft/signalr |
| Java client | GitHub Repository (đã lỗi thời) | Maven package com.microsoft.signalr |
| Kiểu ứng dụng server | ASP.NET (System.Web) hoặc OWIN Self-Host | ASP.NET Core |
| Nền tảng server được hỗ trợ | .NET Framework 4.5 trở lên | .NET Core 3.0 trở lên |
Sự khác biệt về tính năng
Tự động kết nối lại (Automatic reconnects)
Trong ASP.NET SignalR:
- Mặc định, SignalR cố gắng kết nối lại đến server nếu kết nối bị mất.
Trong ASP.NET Core SignalR:
- Tự động kết nối lại là tùy chọn opt-in với cả .NET client và JavaScript client:
HubConnection connection = new HubConnectionBuilder()
.WithUrl(new Uri("http://127.0.0.1:5000/chathub"))
.WithAutomaticReconnect()
.Build();const connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.withAutomaticReconnect()
.build();Hỗ trợ Protocol
ASP.NET Core SignalR hỗ trợ JSON, cũng như một protocol nhị phân mới dựa trên MessagePack. Ngoài ra, các protocol tùy chỉnh có thể được tạo.
Transports
Forever Frame transport không được hỗ trợ trong ASP.NET Core SignalR.
Sự khác biệt phía server
Các thư viện phía server của ASP.NET Core SignalR được bao gồm trong Microsoft.AspNetCore.App, được sử dụng trong template ASP.NET Core Web Application cho cả dự án Razor và MVC.
ASP.NET Core SignalR là một ASP.NET Core middleware (phần mềm trung gian). Nó phải được cấu hình bằng cách gọi AddSignalR trong Startup.ConfigureServices.
services.AddSignalR()
Để cấu hình routing (định tuyến), ánh xạ các route đến hubs bên trong phương thức gọi UseEndpoints trong phương thức Startup.Configure.
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/hub");
});Sticky sessions
Mô hình mở rộng (scaleout model) cho ASP.NET SignalR cho phép clients kết nối lại và gửi thông điệp đến bất kỳ server nào trong farm. Trong ASP.NET Core SignalR, client phải tương tác với cùng một server trong suốt thời gian kết nối. Đối với scaleout sử dụng Redis, điều đó có nghĩa là sticky sessions là bắt buộc. Đối với scaleout sử dụng Azure SignalR Service, sticky sessions không bắt buộc vì service xử lý các kết nối đến clients.
Một hub duy nhất mỗi kết nối
Trong ASP.NET Core SignalR, mô hình kết nối đã được đơn giản hóa. Các kết nối được thực hiện trực tiếp đến một hub duy nhất, thay vì một kết nối duy nhất được sử dụng để chia sẻ quyền truy cập đến nhiều hubs.
Streaming
ASP.NET Core SignalR hiện hỗ trợ streaming data từ hub đến client.
State
Khả năng truyền trạng thái tùy ý giữa các clients và hub (thường được gọi là HubState) đã bị xóa, cũng như hỗ trợ cho các thông điệp tiến trình. Hiện tại không có tương đương của hub proxies.
Xóa bỏ PersistentConnection
Trong ASP.NET Core SignalR, lớp PersistentConnection đã bị xóa.
GlobalHost
ASP.NET Core có dependency injection (DI) được tích hợp sẵn vào framework. Các service có thể sử dụng DI để truy cập HubContext. Đối tượng GlobalHost được sử dụng trong ASP.NET SignalR để lấy HubContext không tồn tại trong ASP.NET Core SignalR.
HubPipeline
ASP.NET Core SignalR không có hỗ trợ cho các module HubPipeline.
Sự khác biệt phía client
TypeScript
ASP.NET Core SignalR client được viết bằng TypeScript. Bạn có thể viết bằng JavaScript hoặc TypeScript khi sử dụng JavaScript client.
JavaScript client được host tại npm
Trong các phiên bản ASP.NET, JavaScript client được lấy thông qua NuGet package trong Visual Studio. Trong các phiên bản ASP.NET Core, package npm @microsoft/signalr chứa các thư viện JavaScript. Package này không được bao gồm trong template ASP.NET Core Web Application. Sử dụng npm để lấy và cài đặt package npm @microsoft/signalr.
npm init -y npm install @microsoft/signalr
jQuery
Sự phụ thuộc vào jQuery đã bị xóa, tuy nhiên các dự án vẫn có thể sử dụng jQuery.
Hỗ trợ Internet Explorer
ASP.NET Core SignalR không hỗ trợ Microsoft Internet Explorer, trong khi ASP.NET SignalR hỗ trợ Microsoft Internet Explorer 8 trở lên. Để biết thêm thông tin, xem ASP.NET Core SignalR supported platforms.
Cú pháp phương thức JavaScript client
Cú pháp JavaScript đã thay đổi so với phiên bản ASP.NET của SignalR. Thay vì sử dụng đối tượng $connection, hãy tạo kết nối bằng API HubConnectionBuilder.
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hub")
.build();Sử dụng phương thức on để chỉ định các phương thức client mà hub có thể gọi.
connection.on("ReceiveMessage", (user, message) => {
const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
const encodedMsg = `${user} says ${msg}`;
console.log(encodedMsg);
});Sau khi tạo phương thức client, khởi động kết nối hub. Nối thêm phương thức catch để ghi log hoặc xử lý lỗi.
connection.start().catch(err => console.error(err));
Hub proxies
Hub proxies không còn được tự động tạo ra nữa. Thay vào đó, tên phương thức được truyền vào API invoke dưới dạng string.
.NET và các client khác
Package NuGet Microsoft.AspNetCore.SignalR.Client chứa các thư viện .NET client cho ASP.NET Core SignalR.
Sử dụng HubConnectionBuilder để tạo và xây dựng một thể hiện kết nối đến một hub.
connection = new HubConnectionBuilder()
.WithUrl("url")
.Build();Sự khác biệt về Scaleout
ASP.NET SignalR hỗ trợ SQL Server và Redis. ASP.NET Core SignalR hỗ trợ Azure SignalR Service và Redis.