关于.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组件的使用
-
关于ubuntu中mysqldump命令无法使用的问题
-
使用Aspose.PDF for .NET将PDF转换为HTML格式示例解读(6)——在style.css中设置字体的URL前缀
-
.NET Core 环境下使用命令行移除某个 nuget 包的具体方法
-
ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)
-
ASP.NET Core中的Http缓存
-
关于Tensorflow中的tf.train.batch函数的使用
-
从壹开始前后端分离【 .NET Core2.0 Api + Vue 2.0 + AOP + 分布式】框架之五 || Swagger的使用 3.3
-
从壹开始前后端分离【 .NET Core2.0 Api + Vue 2.0 + AOP + 分布式】框架之四 || Swagger的使用 3.2
-
Asp.Net Core 2.0 之旅---NLog日志的使用教程