如何使用ASP.NET SignalR和Push.js实现消息即时推送与通知功能?

ASP.NET SignalR 是一个用于实现实时通信的库,它允许服务器和客户端之间进行双向通信,通过使用 SignalR,可以实现消息的即时推送,并结合 Push.js 实现浏览器通知。

如何使用ASP.NET SignalR和Push.js实现消息即时推送与通知功能?

环境准备

1、安装 Visual Studio:确保你已经安装了最新版本的 Visual Studio。

2、创建 ASP.NET Core 项目:在 Visual Studio 中创建一个新的 ASP.NET Core Web 应用程序。

3、添加 SignalR:在项目中添加 SignalR 支持。

步骤一:创建 ASP.NET Core 项目

1、打开 Visual Studio,选择“创建新项目”。

2、选择“ASP.NET Core Web 应用程序”,然后点击“下一步”。

3、配置项目名称和位置,然后点击“创建”。

4、在“创建新的 ASP.NET Core Web 应用程序”对话框中,选择“Web 应用程序(模型-视图-控制器)”,然后点击“创建”。

如何使用ASP.NET SignalR和Push.js实现消息即时推送与通知功能?

步骤二:添加 SignalR 支持

1、打开 NuGet 包管理器控制台(工具 -> NuGet 包管理器 -> 程序包管理器控制台)。

2、运行以下命令以添加 SignalR:

   dotnet add package Microsoft.AspNetCore.SignalR

步骤三:配置 SignalR

1、在Startup.cs 文件中配置 SignalR:

   public void ConfigureServices(IServiceCollection services)
   {
       services.AddControllersWithViews();
       services.AddSignalR();
   }
   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }
       else
       {
           app.UseExceptionHandler("/Home/Error");
           app.UseHsts();
       }
       app.UseHttpsRedirection();
       app.UseStaticFiles();
       app.UseRouting();
       app.UseAuthorization();
       app.UseEndpoints(endpoints =>
       {
           endpoints.MapControllerRoute(
               name: "default",
               pattern: "{controller=Home}/{action=Index}/{id?}");
           endpoints.MapHub<ChatHub>("/chatHub");
       });
   }

2、创建一个 Hub 类ChatHub.cs

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

步骤四:创建前端页面

1、在Views/Home 文件夹下创建一个新的 Razor 视图Index.cshtml

   <!DOCTYPE html>
   <html lang="en">
   <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>SignalR Chat</title>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/5.0.7/signalr.min.js"></script>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/push.js/1.0.9/push.min.js"></script>
   </head>
   <body>
       <div>
           <input type="text" id="userInput" placeholder="Enter your name" />
           <input type="text" id="messageInput" placeholder="Enter your message" />
           <button onclick="sendMessage()">Send</button>
       </div>
       <ul id="messagesList"></ul>
       <script>
           const connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
           connection.on("ReceiveMessage", function (user, message) {
               const msg = document.createElement("li");
               msg.textContent =${user}: ${message};
               document.getElementById("messagesList").appendChild(msg);
               pushNotification(user, message);
           });
           connection.start().catch(function (err) {
               return console.error(err.toString());
           });
           function sendMessage() {
               const user = document.getElementById("userInput").value;
               const message = document.getElementById("messageInput").value;
               connection.invoke("SendMessage", user, message).catch(function (err) {
                   return console.error(err.toString());
               });
           }
           function pushNotification(user, message) {
               if (Notification.permission === "granted") {
                   new Notification(user, { body: message });
               } else if (Notification.permission !== "denied") {
                   Notification.requestPermission().then(permission => {
                       if (permission === "granted") {
                           new Notification(user, { body: message });
                       }
                   });
               }
           }
       </script>
   </body>
   </html>

步骤五:运行项目并测试

1、启动项目,打开浏览器访问https://localhost:5001

2、输入用户名和消息,点击发送按钮,查看消息是否能够即时推送到所有连接的客户端。

3、如果浏览器支持通知,你将看到通知弹出。

如何使用ASP.NET SignalR和Push.js实现消息即时推送与通知功能?

问题与解答

问题一:如何在 SignalR 中处理用户连接和断开?

答:你可以在ChatHub 类中重写OnConnectedAsyncOnDisconnectedAsync 方法来处理用户的连接和断开事件。

public override async Task OnConnectedAsync()
{
    var userName = Context.UserIdentifier; // 获取用户标识符,可以自定义逻辑获取用户名
    await Clients.All.SendAsync("UserConnected", userName);
    await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception exception)
{
    var userName = Context.UserIdentifier; // 获取用户标识符,可以自定义逻辑获取用户名
    await Clients.All.SendAsync("UserDisconnected", userName);
    await base.OnDisconnectedAsync(exception);
}

然后在前端监听这些事件:

connection.on("UserConnected", function (user) {
    const msg = document.createElement("li");
    msg.textContent =${user} has connected;
    document.getElementById("messagesList").appendChild(msg);
});
connection.on("UserDisconnected", function (user) {
    const msg = document.createElement("li");
    msg.textContent =${user} has disconnected;
    document.getElementById("messagesList").appendChild(msg);
});

问题二:如何确保消息的可靠性?

答:SignalR 提供了多种机制来确保消息的可靠性,包括重试策略、心跳检测等,你可以在Startup.cs 中配置这些选项:

services.AddSignalR(options => {
    options.MaximumReceiveMessageSize = 1024 * 1024; // 设置最大接收消息大小为1MB
    options.KeepAliveInterval = TimeSpan.FromSeconds(10); // 设置心跳间隔为10秒
});

还可以在前端处理消息确认机制,以确保消息被成功接收。

到此,以上就是小编对于“ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知的示例代码”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。