0
0
Lập trình
TT

Hướng Dẫn Từng Bước Tích Hợp SignalR Với WebSockets Trong ASP.NET Core

Đăng vào 8 tháng trước

• 5 phút đọc

Chủ đề:

KungFuTech

Khám Phá Ứng Dụng Web Thời Gian Thực: Tối Ưu SignalR & WebSockets

SignalR là một thư viện cho ASP.NET Core giúp đơn giản hóa việc giao tiếp thời gian thực giữa server và client. Nó tự động sử dụng WebSockets khi có sẵn để đạt hiệu suất tối ưu. Hãy cùng theo dõi hướng dẫn toàn diện này để tích hợp SignalR với WebSockets vào ứng dụng ASP.NET Core của bạn.

Mục Lục

1. Yêu Cầu Trước Khi Bắt Đầu

Trước khi bắt đầu, bạn cần chuẩn bị:

  • Visual Studio 2022 hoặc phiên bản mới hơn
  • .NET Core SDK (3.1, 5.0, 6.0 hoặc mới hơn)
  • Kiến thức cơ bản về ASP.NET Core và JavaScript

2. Tạo Dự Án ASP.NET Core Mới

  1. Mở Visual Studio
  2. Chọn Tạo một dự án mới
  3. Chọn ASP.NET Core Web Application
  4. Đặt tên cho dự án và nhấn Tạo
  5. Chọn mẫu ASP.NET Core Web App (Model-View-Controller) hoặc Empty tùy theo sở thích của bạn
  6. Đảm bảo rằng Enable Docker Support không được chọn trừ khi cần thiết
  7. Chọn phiên bản .NET mới nhất và nhấn Tạo

3. Thêm Gói NuGet SignalR

  • Nhấp chuột phải vào dự án của bạn trong Solution Explorer
  • Chọn Quản lý NuGet Packages
  • Tìm kiếm Microsoft.AspNetCore.SignalR
  • Cài đặt gói

4. Cấu Hình SignalR Trong Startup.cs Hoặc Program.cs

Đối Với .NET 5 Hoặc Trước Đó (Startup.cs):

csharp Copy
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    // Thêm dịch vụ SignalR
    services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // middleware hiện có...
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        // Map SignalR hub
        endpoints.MapHub<MyHub>("/myHub");
    });
}

Đối Với .NET 6+ (Program.cs):

csharp Copy
var builder = WebApplication.CreateBuilder(args);

// Thêm dịch vụ
builder.Services.AddControllersWithViews();
builder.Services.AddSignalR();

var app = builder.Build();

app.UseRouting();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// Map SignalR Hub
app.MapHub<MyHub>("/myHub");

app.Run();

5. Tạo Lớp SignalR Hub

Tạo một lớp mới MyHub.cs:

csharp Copy
using Microsoft.AspNetCore.SignalR;

public class MyHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

Lớp hub này cho phép phát sóng tin nhắn đến tất cả các client được kết nối.

6. Tạo Mặt Khách (HTML + JavaScript)

Trong Index.cshtml hoặc một view tương tự:

html Copy
<!DOCTYPE html>
<html>
<head>
    <title>Demo SignalR WebSocket</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.0/signalr.min.js"></script>
</head>
<body>
    <h1>Demo SignalR WebSocket</h1>
    <input type="text" id="userInput" placeholder="Tên của bạn" />
    <input type="text" id="messageInput" placeholder="Tin nhắn" />
    <button id="sendButton">Gửi</button>

    <ul id="messagesList"></ul>

    <script>
        // Tạo kết nối
        const connection = new signalR.HubConnectionBuilder()
            .withUrl("/myHub")
            .withAutomaticReconnect()
            .build();

        // Bắt đầu kết nối
        connection.start().then(() => {
            console.log("Kết nối tới hub SignalR thành công");
        }).catch(err => {
            console.error(err.toString());
        });

        // Nhận tin nhắn
        connection.on("ReceiveMessage", (user, message) => {
            const li = document.createElement("li");
            li.textContent = `${user}: ${message}`;
            document.getElementById("messagesList").appendChild(li);
        });

        // Gửi tin nhắn
        document.getElementById("sendButton").addEventListener("click", () => {
            const user = document.getElementById("userInput").value;
            const message = document.getElementById("messageInput").value;
            connection.invoke("SendMessage", user, message).catch(err => {
                console.error(err.toString());
            });
        });
    </script>
</body>
</html>

7. Kích Hoạt WebSockets Trong Cấu Hình Server

  • WebSockets sẽ được sử dụng tự động khi hỗ trợ.
  • Đảm bảo WebSockets được kích hoạt trong môi trường lưu trữ của bạn:
    • IIS, Azure hoặc các nhà cung cấp lưu trữ khác nên có hỗ trợ WebSocket đã được bật.
    • Trong launchSettings.json hoặc cấu hình IIS, xác minh rằng hỗ trợ WebSockets có sẵn.

8. Chạy Ứng Dụng Của Bạn

  • Nhấn F5 hoặc Ctrl + F5.
  • Mở nhiều cửa sổ trình duyệt.
  • Gửi tin nhắn từ một cửa sổ và quan sát các cập nhật theo thời gian thực trên tất cả các cửa sổ khác.

9. Một Số Mẹo Bổ Sung

  • Tự động chuyển đổi: SignalR tự động chuyển sang Server-Sent Events hoặc Long Polling nếu WebSockets không có sẵn.
  • Sử dụng WebSocket rõ ràng: Để buộc sử dụng chỉ WebSockets:
csharp Copy
.withUrl("/myHub", { transport: signalR.HttpTransportType.WebSockets })
  • Bảo mật: Luôn sử dụng HTTPS và triển khai xác thực khi cần thiết.

10. Tóm Tắt

  • Cài đặt gói SignalR
  • Cấu hình dịch vụ và endpoints
  • Tạo lớp Hub
  • Kết nối từ client bằng JavaScript
  • Gửi và nhận tin nhắn theo thời gian thực

Lưu ý: WebSockets sẽ được sử dụng tự động khi có sẵn, cung cấp giao tiếp thời gian thực nhanh chóng và hiệu quả.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào