aspnetcore SignalR的使用

666 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

什么是 SignalR

SignalR 是一个 web socket开源库,可使服务端代码能够立即将内容推送至客户端。

适合SignalR的场景:

  • 简单的游戏、聊天功能、GPS 应用、即时性的信息
  • 多人协作的一些应用
  • 使用客户端的一些通知

Asp.net core中使用SignalR

效果图:

image.png

2.1 配置

public void ConfigureServices(IServiceCollection services)
{

    services.AddControllers();
    services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseDefaultFiles();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

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

我们先是在 ConfigureServices 中注入了 SignalR ,注入完毕之后还需要在 Endpoints 里面 MapHub, 这个就相当于hub的路由

2.2 Hub文件

image.png

Hub文件里面只有一个方法,该方法会向所有正在连接的客户端发送一条消息。此处SignarlR 的默认序列化器是Json。new 的匿名对象将会把变成JSON传回前端。

2.3 如何在前端调用

image.png

这里只做一个简单调用示例,它绑定了 chatHub 的路径,打开后。点击按钮将使用 connection.invoke() 向后端发送消息,当接收到服务端方法ReciveMessage 追加了元素到 ul 中

2.4 signarlR 的使用

  • 我们在微服务项目应该尽量使用redis做signalr的 connection 实例容器,这样会比较方便集群
  • 全程应该使用异步,在之前的文章有说过异步IO可以让线程资源不至于紧张
  • 用户与用户聊天应该使用Clients.Client(connectionId)的形式,且托管的网站必须要是wss。然后需要注意的是客户端尽量加密消息内容。
  • 若使用redis做底板的话,最好做一个connection pool,不太推荐单例的redis
  • 可以使用非Json的序列化器,但需要客户端要支持
  • 推送给多人可以使用Client.Groups

总结

本节教大家搭建了一个基础的signalR,由于本人水平有限而没有做出更多案例和高价的应用。后面闲时会补上的....一定