SignalR牛刀小试

在MVP杨老师的博客里看到这么个东西,我还以为是NetCore3才推出的新玩意,原来是已经有很多年的历史了,那看来还是比较成熟的一个技术了。

简介

SignalR是一个.NET Core/.NET Framework的开源实时框架,SignalR的可使用Web Socket, Server Sent Events 和 Long Polling作为底层传输方式。

SignalR基于这三种技术构建,抽象于它们之上,它让你更好的关注业务问题而不是底层传输技术问题。

以上介绍来自博客,SignalR分为客户端和服务端,服务端运行在AspNetCore上,客户端支持前端、桌面端和移动端,我去查了一下,连Flutter也有相应的支持库。

几个概念

回落机制

SignalR支持三种底层传输技术,根据客户端的兼容性可以自动协商传输类型。如图

Web Socket是最好的最有效的传输方式,如果浏览器或Web服务器不支持它的话,就会降级使用SSE,实在不行就用Long Polling。

RPC

不用解释太多,Remote Procedure Call,SignalR采用RPC范式来进行服务端和客户端之间的通信。

Hub

Hub是SignalR的一个组件,运行在服务端,它是一个通信用的组件, Hub使用RPC接受从客户端发来的消息,也能把消息发送给客户端 。

关于横向扩展

SignalR针对多种底层通信方式有了 Sticky Sessions (粘性会话) 这种解决方案,可以保证一个客户端在一次会话中的请求都分配给同一个服务器,具体以后需要的时候再研究。

开始使用

我要做的是一个聊天室,所以只需要写一个简单的服务就可以了。

首先要创建AspNetCore项目,注册SignalR服务:

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSignalR();
}

创建ChatService类:

public class ChatService
{
private readonly List<ChatMessage> _messages;
private readonly IHubContext<ChatHub> _context;
public List<ChatMessage> Messages { get => _messages; }
public ChatService(IHubContext<ChatHub> context)
{
_context = context;
_messages = new List<ChatMessage>();
}
}

消息实体类:

public class ChatMessage
{
public string UserName { get; set; }
public string Content { get; set; }
public DateTime SendedTime { get; set; }
public string ClientName { get; set; }
}

关键的来了,编写Hub:

使用SendAsync可以进行远程调用

public class ChatHub : Hub {
private readonly ChatService _chatService;
public ChatHub(ChatService chatService) {
_chatService = chatService;
}
public async Task GetMessages(string connectionId) {
var data = _chatService.Messages;
await Clients.Client(connectionId).
SendAsync("GetMessages", data);
}
public async Task SendMessage(string userName, string content, string clientName) {
var msg = new Models.ChatMessage {
UserName = userName,
Content = content,
SendedTime = DateTime.Now,
ClientName = clientName
};
_chatService.Messages.Add(msg);
await Clients.All.SendAsync("SendMessage", msg);
}
public override Task OnConnectedAsync() {
GetMessages(Context.ConnectionId);
return base.OnConnectedAsync();
}
}

注册依赖注入和中间件

依赖注入

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSignalR();
services.AddSingleton<CountService>();
services.AddSingleton<ChatService>();
}

中间件

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chat");
});
}

客户端

为了方便我就用网页来做。

首先写个简单的聊天界面布局,这里就不贴代码了没啥技术含量,效果大概这样:

首先要安装signalr.js,通过npm安装即可。

然后需要编写js:

function setupConnection() {
connection = new signalR.HubConnectionBuilder()
.withUrl("/chat")
.build(); connection.on("SendMessage", message => {
console.log(message);
addMsg(message.userName, message.sendedTimeStr, message.content, message.clientName);
}); connection.on("GetMessages", data => {
console.log(data);
for (var i = 0; i < data.length; i++) {
let message = data[i];
addMsg(message.userName, message.sendedTimeStr, message.content, message.clientName);
}
}); connection.on("Finished", () => {
connection.stop();
console.log("finished.")
}); connection.start()
.catch(err => console.error(err.toString()));
}

通过以下代码可以远程调用服务器的方法:

connection.invoke("SendMessage", username, content, '网页客户端');

然后就可以打开多个浏览器测试了。

这是我在手机上的截图

PS:为了把这个部署到服务器,我还买了个新的阿里云服务器。。

参考资料

欢迎交流

交流问题请在微信公众号后台留言,每一条信息我都会回复哈~

Asp-Net-Core学习笔记:3.使用SignalR实时通信框架开发聊天室的更多相关文章

  1. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  2. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  3. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

  4. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  5. asp.net.core学习笔记1:swagger的使用和webapi接收Jobject对象

    环境:asp.net.core 3.1 (一觉醒来官方已经不推荐3.0了,于是没有任何core经验,也只能开始了3.1的开发学习) 由于现有项目前后端分离.微服务化日趋流行,所以上手不采用web应用( ...

  6. Asp.net Core学习笔记

    之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...

  7. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  8. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  9. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  10. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

随机推荐

  1. winform 各种小功能

    1.  实现待查询功能的combox private void Frm_Main_Load(object sender, EventArgs e) { cbox_Find.Items.Clear(); ...

  2. hdu 5547

    ***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字 思路:DFS暴力搜索, 每个位置填1-4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出 ...

  3. python爬虫-豆瓣电影top250

    一.python爬虫简介1.什么是爬虫:网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本.由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略 ...

  4. python常见面试题讲解(七)合并表记录

    题目描述 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的in ...

  5. java项目实践-webapp-mytomcat-day16

    目录 1. http协议 2. 自定义的web框架 3. 具体实现 4. 启动 1. http协议 CS架构 建立连接"三次握手" 断开连接 "四次挥手" 三次 ...

  6. [转帖]SQL Server高级进阶之索引碎片维护

    https://www.cnblogs.com/atomy/p/15268589.html 一.产生原因及影响 索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据, ...

  7. [转帖]Oracle JDBC中的语句缓存

    老熊 Oracle性能优化 2013-09-13 在Oracle数据库中,SQL解析有几种: 硬解析,过多的硬解析在系统中产生shared pool latch和library cache liatc ...

  8. [转帖]decimal,float和double的区别是什么?

    https://zhuanlan.zhihu.com/p/352503879 今天复习mysql理论知识,在看常用数据类型的时候发现float和decimal类型都是表示小数,就展开搜索学习了一下区别 ...

  9. [转帖]VMWare ESXi中,不同的虚拟网卡性能竟然能相差三倍!

    https://zhuanlan.zhihu.com/p/525656364 正文共:1024 字 11 图,预估阅读时间:1 分钟 在上个实验中(VPP使用DPDK纳管主机网卡),我们已经初步实现了 ...

  10. Rsync原理的学习与总结

    Rsync原理的简单学习 前言 工作这么多年, 感觉对自己帮助最大的是rsync. 用了很多rsync的脚本, 甚至因为这个脚本授权了两个专利. 但是昨天晚上在跟高手聊天时发现 自己对rsync 其实 ...