ASP.NET Core: Bắt đầu với ASP.NET Core SignalR
Bài hướng dẫn này cung cấp kiến thức cơ bản về xây dựng ứng dụng thời gian thực (real-time) bằng SignalR. Bạn được dạy cách để:
- Tạo một dự án web.
- Thêm thư viện máy khách SignalR.
- Tạo một trung tâm SignalR.
- Định cấu hình dự án để sử dụng SignalR.
- Thêm mã gửi tin nhắn từ bất kỳ máy khách nào đến tất cả các máy khách được kết nối.
Cuối cùng, bạn sẽ có một ứng dụng trò chuyện đang hoạt động:
Điều kiện tiên quyết
Bạn cần có Visual Studio 2022+ với ASP.NET and web development đã được cài đặt.
Tạo một dự án ứng dụng web
Khởi động Visual Studio 2022 và chọn Create a new project.
Trong hộp thoại Create a new project, chọn ASP.NET Core Web App rồi chọn Next.
Trong hộp thoại Configure your new project, nhập tên dự án là SignalRChat
. Điều quan trọng là phải đặt tên cho dự án SignalRChat
, bao gồm cả cách viết hoa phù hợp, để các namespace khớp với code trong hướng dẫn.
Chọn Next.
Trong hộp thoại Additional information, chọn .NET 7.0 (Standard Term Support) rồi chọn Create.
Thêm thư viện client SignalR
Thư viện server (máy chủ) SignalR được bao gồm trong framework chia sẻ ASP.NET Core. Thư viện client (máy khách) JavaScript không tự động được đưa vào dự án. Đối với hướng dẫn này, hãy sử dụng Trình quản lý thư viện (LibMan) để lấy thư viện máy khách từ unpkg. unpkg
là mạng phân phối nội dung toàn cầu, nhanh chóng cho mọi thứ trên npm.
Trong Solution Explorer, bấm chuột phải vào dự án và chọn Add > Client-Side Library.
Trong hộp thoại Add Client-Side Library:
- Chọn unpkg ở phần Provider
- Nhập
@microsoft/signalr@latest
ở phần Library. - Chọn Choose specific files, mở rộng thư mục dist/browser và chọn
signalr.js
vàsignalr.min.js
. - Đặt Target Location thành
wwwroot/js/signalr/
. - Chọn Install.
LibMan sẽ tạo thư mục wwwroot/js/signalr
và sao chép các tệp đã chọn vào đó.
Tạo hub SignalR
Hub là một lớp đóng vai trò là một đường dẫn cấp cao xử lý giao tiếp giữa máy khách và máy chủ.
Trong thư mục dự án SignalRChat, hãy tạo một thư mục có tên Hubs
.
Trong thư mục Hubs
, tạo lớp ChatHub
với code như sau:
using Microsoft.AspNetCore.SignalR; namespace SignalRChat.Hubs { public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } }
Lớp ChatHub
kế thừa từ lớp SignalR Hub. Lớp Hub
quản lý các kết nối, nhóm và nhắn tin.
Phương thức SendMessage
có thể được gọi bởi một máy khách được kết nối để gửi tin nhắn đến tất cả các máy khách. Mã máy khách JavaScript gọi phương thức này sẽ được hiển thị sau trong hướng dẫn. Mã SignalR không đồng bộ để cung cấp khả năng mở rộng tối đa.
Định cấu hình SignalR
Máy chủ SignalR phải được cấu hình để truyền các yêu cầu SignalR tới SignalR. Thêm code được đánh dấu (high-light) sau đây vào file Program.cs
.
using SignalRChat.Hubs; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); builder.Services.AddSignalR(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); app.MapHub<ChatHub>("/chatHub"); app.Run();
Những lệnh được đánh dấu (high-light) ở trên sẽ thêm SignalR vào ASP.NET Core các hệ thống định tuyến và dependency injection.
Thêm code máy khách SignalR
Thay thế nội dung Pages/Index.cshtml
bằng đoạn mã sau:
@page <div class="container"> <div class="row p-1"> <div class="col-1">User</div> <div class="col-5"><input type="text" id="userInput" /></div> </div> <div class="row p-1"> <div class="col-1">Message</div> <div class="col-5"><input type="text" class="w-100" id="messageInput" /></div> </div> <div class="row p-1"> <div class="col-6 text-end"> <input type="button" id="sendButton" value="Send Message" /> </div> </div> <div class="row p-1"> <div class="col-6"> <hr /> </div> </div> <div class="row p-1"> <div class="col-6"> <ul id="messagesList"></ul> </div> </div> </div> <script src="~/js/signalr/dist/browser/signalr.js"></script> <script src="~/js/chat.js"></script>
Phần markup HTML ở trên:
- Tạo hộp văn bản và nút submit.
- Tạo một danh sách với
id="messagesList"
để hiển thị các tin nhắn nhận được từ hub SignalR. - Đưa vào các tham chiếu tập lệnh tới SignalR và mã ứng dụng
chat.js
sẽ được tạo trong bước tiếp theo.
Trong thư mục wwwroot/js
, tạo một file chat.js
với đoạn code sau:
"use strict"; var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); //Disable the send button until connection is established. document.getElementById("sendButton").disabled = true; connection.on("ReceiveMessage", function (user, message) { var li = document.createElement("li"); document.getElementById("messagesList").appendChild(li); // We can assign user-supplied strings to an element's textContent because it // is not interpreted as markup. If you're assigning in any other way, you // should be aware of possible script injection concerns. li.textContent = `${user} says ${message}`; }); connection.start().then(function () { document.getElementById("sendButton").disabled = false; }).catch(function (err) { return console.error(err.toString()); }); document.getElementById("sendButton").addEventListener("click", function (event) { var user = document.getElementById("userInput").value; var message = document.getElementById("messageInput").value; connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); }); event.preventDefault(); });
Đoạn code JavaScript trên:
- Tạo và bắt đầu một kết nối.
- Thêm vào nút submit một trình xử lý gửi tin nhắn đến hub.
- Thêm vào đối tượng kết nối một trình xử lý nhận tin nhắn từ hub và thêm chúng vào danh sách.
Chạy ứng dụng
Nhấn tổ hợp phím Ctrl+ F5 để chạy ứng dụng mà không cần gỡ lỗi.
Sao chép URL từ thanh địa chỉ, mở một phiên bản hoặc tab trình duyệt khác và dán URL vào thanh địa chỉ.
Chọn một trong hai trình duyệt, nhập tên và tin nhắn, rồi chọn nút Send Message.
Tên và tin nhắn được hiển thị trên cả hai trang ngay lập tức.
Mẹo
Nếu ứng dụng không hoạt động, hãy mở công cụ dành cho nhà phát triển trình duyệt (F12) và chuyển đến bảng điều khiển. Tìm kiếm các lỗi có thể xảy ra liên quan đến mã HTML và JavaScript. Ví dụ: nếu
signalr.js
được đặt trong một thư mục khác với thư mục được chỉ dẫn, tham chiếu đến tệp đó sẽ không hoạt động, dẫn đến lỗi 404 trong bảng điều khiển.
Nếu
ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
xảy ra lỗi trong Chrome, hãy chạy các lệnh sau để cập nhật chứng chỉ phát triển:dotnet dev-certs https --clean
dotnet dev-certs https --trust
Xuất bản lên Azure
Để biết thông tin về cách triển khai lên Azure, hãy xem Triển khai ứng dụng web ASP.NET.
Để biết thêm thông tin về Dịch vụ Azure SignalR, hãy xem Dịch vụ Azure SignalR là gì?.