欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于.net core 中的signalR组件的使用

程序员文章站 2022-06-14 08:16:49
SignalR是为了提供更方便的web交互响应式到推送式的解决方案。有了它之后可以实现客户端直接调用服务端的方法并且获得返回值 (客户端可以是各种平台,目前SignalR支持的语言版本有C#、java、javaScript、nodejs等),服务端也是可以调用客户端的方法,通过这样的方式实现了由原来 ......

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("消息发送完成");
    });
})

  

 关于.net core 中的signalR组件的使用

 

 

 上面是最终的结果 可以看出实现了不同客户端之间的消息互通  

其实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 但是某一些浏览器是不支持的;

以上代码的demo地址