关于.net core 中的signalR组件的使用
SignalR是为了提供更方便的web交互响应式到推送式的解决方案。有了它之后可以实现客户端直接调用服务端的方法并且获得返回值 (客户端可以是各种平台,目前SignalR支持的语言版本有C#、java、javaScript、nodejs等),服务端也是可以调用客户端的方法,通过这样的方式实现了由原来的单通变成双通的目的。
在SignalR中有个非常重要的概念就是Hub,这个Hub如果拿到以前的MVC架构中所对应的就是控制器,他们的区别就是我们需要自己去注册这个Hub的路由,而控制器是可以基于约定的。
首先创建一个Hub
public class NewsPushHub:Hub
{ }
这是一个新闻推送的Hub,它必须要继承至Hub这个基类,Hub这个基类还可以接收一个泛型的实现,这个泛型可以用来规范客户端的方法
public class NewsPushHub : Hub<IClientFuncs>
{
/// <summary>
/// 可以被客户端调用的方法
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public async Task DepartmentNotice(string msg)
{
//这里发送只能是接口中约束的方法
await Clients.All.SendMsg( msg);
}
}
/// <summary>
/// 定义客户端所监听的方法名称
/// </summary>
public interface IClientFuncs
{
Task SendMsg(string msg);
}
这里面写的两个方法是可以被客户端直接调用的,但是在被调用之前首先要注册,在Core3.0之前 我们是用app.UseSignalR(hub=>hub.MapHub<NewsPushHub>("/SignalRNews"))来注册SignalR的访问路由,现在改成全部统一在app.UseEndpoints()这个扩展方法中去注册,现在在Startup类的代码就像这样了
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<NewsPushHub>("/SignalRNews");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
}); }
在这个里面我配置了包含MVC的中间件和依赖注入,在3.0中MVC的中间件和依赖注入都变了 变得更加具体,路由设置也变得统一在UseEndpoints()这个方法里面,它里面的委托是一个IEndpointRouteBuilder的参数,我们通过这个参数可以映射各种路由配置,有非常多的map,在这里配置MVC的目的是为了和SignalR交互的。下面是客户端的js代码首先需要安装aspnet-signalr
//创建一个匹配 http:localhost:5000/SignalRNews路由的连接
const connection = new signalR.HubConnectionBuilder()
.withUrl("/SignalRNews")
.configureLogging(signalR.LogLevel.Information)
.build();
// 开始连接,这个时候会发送一个101状态为pending的连接
connection.start().then(function () {
console.log("connected");
});
// 监听服务端调用的客户端方法
connection.on("sendMsg", (msg) => {
$(".dispaly-message").append(`<p>${msg}</p>`);
}); $("#submit").click(e => {
const msg = $("#msg").val();
// 调用服务端的DepartmentNotice方法
connection.invoke("DepartmentNotice", msg).then(() => {
console.log("消息发送完成");
});
})

上面是最终的结果 可以看出实现了不同客户端之间的消息互通
其实Signalr还可以有依赖注入的用法例如在控制器里面注入 然后直接在MVC中随意推送消息
public class HomeController:Controller
{
private readonly IHubContext<NewsPushHub> _hub; public HomeController(IHubContext<NewsPushHub> hub)
{
this._hub = hub;
}
public IActionResult Index()
{
_hub.Clients.All.SendAsync("Temp", "test");
return View();
} }
从上面代码中看的出在Home控制器中注入了NewsPushHub这个Hub 只要有一个客户端访问Index界面就会通知所有的客户端
总结:SignalR把原来复杂低效率的双通编程变得简单,Siganlr只要是支持3中模式进行客户端和服务端的连接(1、长轮询模式 2、服务器发送事件 3、websocket)最高效的当然是websocket 但是某一些浏览器是不支持的;
关于.net core 中的signalR组件的使用的更多相关文章
- .NET Core中的验证组件FluentValidation的实战分享
今天有人问我能不能出一篇FluentValidation的教程,刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation,所以就以修改用户密码 ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- .NET Core中的数据保护组件
原文地址: PREVENTING INSECURE OBJECT REFERENCES IN ASP.NET CORE 2.0 作者: Tahir Naushad 背景介绍 在 OWASP(开放式 W ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- asp.net core 中的SignalR与web前端进行实时通信
一.介绍 SignalR是.net 开源库,用于构建需要实时进行用户交互和数据更新的web应用,如在线聊天,游戏,天气等实时应用程序,且简化了构建实时应用的过程,包括服务端库和js端库,继承了数种常见 ...
- 一、在 ASP.NET Core 中使用 SignalR
一.介绍 SignalR 是一个用于实现实时网站的 Microsoft .NET 库.它使用多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端. https://docs ...
- 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器
前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...
- 【SignalR全套系列】之在.Net Core 中实现SignalR实时通信
微信公众号:趣编程ACE 关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码 [如果觉得本公众号对您有帮助,欢迎关注] 前文回顾 [SignalR全套系列]之在.NetCo ...
- 在 ASP.NET Core 中使用 SignalR
https://weblogs.asp.net/ricardoperes/signalr-in-asp-net-core 作者:Ricardo Peres 译者:oopsguy.com 介绍 Sign ...
随机推荐
- python循环删除列表元素留一个问题
https://www.cnblogs.com/baihualin/p/10698651.html 引用up
- eclipse设置序列化忽略生成serialVersionUID警告
java中的类想要序列化必须实现java.io.Serializable接口,一般实现接口都会用警告信息,提示生成serialVersionUID,虽然我觉得这个应该生成才合理.这里还是记录一下取消生 ...
- Golang 需要避免踩的 50 个坑(二)
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- eclipse 工作空间配置UTF-8编码格式
配置前端页面编码格式 1. Windows-->preferences 2. web-->jsp file-->Encoding 3. OK保存 配置java文件编码格式 1. W ...
- C++小工具
1.Doxygen 从源代码生成文档.可以生成在线文档(HTML)和离线手册(以LATEX格式),还可以自动生成各种依赖关系图,继承关系图等.
- JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(一)
未完待续 ........ 由于SimpleDateFormat存在线程安全问题,所以在JDK1.8中使用LocalDate和LocalDateTime来进行日期的工具类使用,下边就是原创的Local ...
- 06-C#笔记-常量
1. 进制 前缀:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制. 后缀:可以是 U 或 L 的组合,其中,U 和 L 分别表示 unsigned 和 long.后缀可以是大写或者 ...
- 阿里云物联网平台: Android 连接阿里云物联网平台
说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码 https: ...
- Kali系统改国内源配置和SSH配置
一.Kali系统更新源 使用官网的虚拟化镜像安装,默认为英文界面,更新源也是官方源.因为官方服务器在国外,速度不是很理想,现在就来改国内源并且更新系统. 1.使用编辑器打开系统源文本(在终端内操作,先 ...
- 恐怖的AVL树
学习参考:http://www.cnblogs.com/Camilo/p/3917041.html 今天闲来无事打算学习AVL树,并以AVL树的插入作为切入点. 不知不觉,我就在电脑前编了4个小时…… ...