这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
什么是 SignalR
SignalR 是一个 web socket开源库,可使服务端代码能够立即将内容推送至客户端。
适合SignalR的场景:
- 简单的游戏、聊天功能、GPS 应用、即时性的信息
- 多人协作的一些应用
- 使用客户端的一些通知
Asp.net core中使用SignalR
效果图:
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文件
Hub文件里面只有一个方法,该方法会向所有正在连接
的客户端发送一条消息。此处SignarlR 的默认序列化器是Json。new 的匿名对象将会把变成JSON传回前端。
2.3 如何在前端调用
这里只做一个简单调用示例,它绑定了 chatHub 的路径,打开后。点击按钮将使用 connection.invoke() 向后端发送消息,当接收到服务端方法ReciveMessage 追加了元素到 ul 中
2.4 signarlR 的使用
- 我们在微服务项目应该尽量使用redis做signalr的 connection 实例容器,这样会比较方便集群
- 全程应该使用异步,在之前的文章有说过
异步IO
可以让线程资源不至于紧张 - 用户与用户聊天应该使用
Clients.Client(connectionId)
的形式,且托管的网站必须要是wss。然后需要注意的是客户端尽量加密消息内容。 - 若使用redis做底板的话,最好做一个connection pool,不太推荐单例的redis
- 可以使用非Json的序列化器,但需要客户端要支持
- 推送给多人可以使用Client.Groups
总结
本节教大家搭建了一个基础的signalR,由于本人水平有限而没有做出更多案例和高价的应用。后面闲时会补上的....一定