ASP.NET Core: Bắt đầu với ASP.NET Core SignalR


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

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:

SignalR sample app

Đ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.

Khối lượng công việc của trình cài đặt VS22

Tạo một dự án ứng dụng web

Khởi động Visual Studio 2022 và chọn Create a new project.

Tạo một dự án mới từ cửa sổ bắt đầu

Trong hộp thoại Create a new project, chọn ASP.NET Core Web App rồi chọn Next.

Tạo một ứng dụng web ASP.NET Core

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.

Additional information

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ừ unpkgunpkg 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.

Thêm hộp thoại Thư viện phía máy khách - chọn thư viện

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 CtrlF5 để 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.

Đã hoàn thành ứng dụng mẫu SignalR

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.

lỗi signalr.js không tìm thấy

Nếu ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYxả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ì?.

Bước tiếp theo

Nguồn: learn.microsoft.com
» Tiếp: Dịch vụ Azure SignalR là gì?
« Trước: Tổng quan về Migration
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!