什么是 SignalR?.NET 的实时通信框架

嗨,开发人员

在当今的数字世界中,即时反馈和实时更新至关重要,开发人员需要能够实现客户端和服务器之间无缝双向通信的工具。**SignalR** 是 ASP.NET 生态系统中的一个库,它通过提供强大的实时 Web 功能框架简化了此过程。

什么是 SignalR?

**SignalR** 是 **ASP.NET Core** 的一个开源库,可促进服务器和客户端之间的实时通信。借助 SignalR,开发人员可以为应用程序添加实时 Web 功能,从而允许服务器即时将更新推送到客户端。

这意味着不再需要不断轮询或刷新更新——客户端可以在新数据可用时立即接收。

SignalR 如何工作?

SignalR 通过支持多种传输协议来抽象建立和管理实时连接的复杂性,其中包括:

  • WebSockets:最有效的选项,提供全双工通信通道。
  • 服务器发送事件 (SSE):从服务器向客户端发送更新。
  • 长轮询:旧版浏览器的后备机制。
  • SignalR 根据客户端和服务器功能自动选择最佳可用的传输方法。

    SignalR 的主要功能

  • 双向通信:实现客户端和服务器之间的实时交互。
  • 自动回退:选择最佳的传输机制以实现兼容性。
  • 可伸缩性:支持使用 Redis、Azure SignalR 服务或其他底板进行水平扩展。
  • 群组:组织并发送消息给已连接客户端的子集。
  • SignalR 的用例

    SignalR 在实时通信至关重要的应用中大放异彩。以下是一些常见用例:

  • 实时聊天应用程序:使用户能够即时交换消息。
  • 实时仪表板:无需重新加载页面即可更新指标、股票价格或绩效数据。
  • 协作工具:同步共享文档或白板。
  • 在线游戏:提供无缝的玩家互动和更新。
  • SignalR 实际应用:一个简单的示例

    让我们构建一个基本的聊天应用程序来观察 SignalR 的实际运行。

    步骤 1:在 ASP.NET Core 项目中安装 SignalR

    添加 SignalR 包:

    dotnet add package Microsoft.AspNetCore.SignalR

    步骤 2:创建中心

    集线器是客户端和服务器交互的核心通信管道。

    using Microsoft.AspNetCore.SignalR;  
    
    public class ChatHub : Hub  
    {  
        public async Task SendMessage(string user, string message)  
        {  
            await Clients.All.SendAsync("ReceiveMessage", user, message);  
        }  
    }

    步骤 3:在启动中配置 SignalR

    在你的“Startup.cs”或“Program.cs”中设置SignalR:

    app.UseEndpoints(endpoints =>  
    {  
        endpoints.MapHub("/chatHub");  
    });

    步骤 4:创建客户端脚本

    使用 JavaScript 连接到集线器并发送/接收消息:

    const connection = new signalR.HubConnectionBuilder()  
        .withUrl("/chatHub")  
        .build();  
    
    connection.on("ReceiveMessage", (user, message) => {  
        const msg = `${user}: ${message}`;  
        document.getElementById("messages").innerHTML += `
  • ${msg}
  • `; }); 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())); }); connection.start().catch(err => console.error(err.toString()));

    步骤 5:运行应用程序

    导航到您的应用程序,并开始实时聊天!

    缩放 SignalR

    SignalR 支持扩展以使用背板处理多个服务器和数千个连接,例如:

  • Redis:适用于本地解决方案。
  • Azure SignalR 服务:一种无需额外基础架构即可扩展 SignalR 应用的托管服务。
  • 为什么使用 SignalR?

    SignalR 简化了实时应用程序的构建,无需担心传输协议或连接管理的复杂性。无论是聊天应用程序、实时仪表板还是多人游戏,SignalR 都提供了创建无缝交互式体验的工具。

    结论

    实时通信不再是一种奢侈,而是现代应用程序的必需品。借助 SignalR,.NET 开发人员可以利用强大、可扩展的框架来满足这一需求。

    你在项目中使用过 SignalR 吗?在下面的评论中分享你的经验或挑战!