.net core SignalR——服务器实时消息推送

栏目: ASP.NET · 发布时间: 4年前

内容简介:在有两种方式可以实现这样的功能:两种方案的选择:

原生js实现文件上传并显示进度条 一文中,我们实现了一个Excel上传功能,并且显示了服务端实时处理进度 (正在处理第N行...) ,不用让用户一直傻等而不知道什么情况,这样极大的提高了用户的体验

有两种方式可以实现这样的功能:

js
websocket

两种方案的选择:

传统的长轮询也能实现消息实时,就是定时向服务器发送请求获取消息,但是这样对服务器压力比较大,而 websocket 基于 http 进行一次握手功能,后面就不走 http

.net 中, SignalR 用来实现服务器和客户端双向通信的一个框架,是对 websocket 的很好的一个封装,所以我选择了它。

当然,其他语言肯定都是支持 websocket 通信的,不仅仅局限于 .net ,像 nodejssocket.io

SignalR

SignalR.net 中的一个服务器和客户端双向通信的一个框架,面向web端的即时通讯, SignalR 更简单,对 websocket 通信进行了封装

SignalR 没有连接限制,取决于服务器配置,浏览器客户端有限制,chrome一般是5个 websocket 连接

可以做什么

  • 站内实时聊天、消息通知
  • web页面实时数据的展示
  • 自适应通信协议,如果浏览器或服务器支持 websocket ,就使用 websocket 通信协议,否则就降级,使用长轮询 服务器一般需要手动开启
  • .net core 跨平台,在2.2版本已经正式内置了 SignalR

.net core 服务端配置

startupConfigureServices 方法内部添加 SignalR 服务 services.AddSignalR();Configure 中配置具体的 Hub (路由器、中转):

app.UseSignalR(routes =>
    {
        routes.MapHub<TestHub>("/testHub");     //可以多个map
    });
    
    app.UseMvc();           //注意UseSignalR需要在UseMvc()之前
复制代码

这样 SignalR 服务器端就开发完成了,网页、 Java 、.Net客户端都可以连接的

Hub 消息处理中心

public class TestHub : Hub
{
    public TestHub()
    {
    }

    public async Task SendMessage(string message, string name)
    {
        #region Client
        //this.Context.ConnectionId                 //每个连接一个connectionId  表示唯一客户端
        //this.Clients.Client().SendAsync();        //指定发送消息
        //this.Clients.Clients()        
        #endregion             //给多个client发消息


        #region Group
        //this.Clients.Group();                     //给某个组发消息
        //this.Clients.Groups()                     //给多个组发消息
        //this.Groups.AddToGroupAsync()             //将指定连接加入组
        //this.Groups.RemoveFromGroupAsync()        //将指定连接移除组 
        #endregion

        await Clients.All.SendAsync("onMsg", DateTime.Now, message);
    }


    //上下线消息  连接、断开事件

    //客户端连接上
    public override Task OnConnectedAsync()
    {
        return base.OnConnectedAsync();
    }

    //客户端断开
    public override Task OnDisconnectedAsync(Exception exception)
    {
        string connectionId = this.Context.ConnectionId;
        return base.OnDisconnectedAsync(exception);
    }
}
复制代码

以上可以看到 SignalR 封装了很多常用方法 (发送指定消息、群发...) ,我们可以很简单的使用达到目的

web端引入 SignalRjs 对应类库,调用服务端对应的方法即可

var connection = new signalR.HubConnectionBuilder().withUrl("/testHub").build();
connection.on("onMsg", function (data, message) {
    console.log(data);
    var li = document.createElement('li');
    li.textContent = `${data}:${message}`;
    document.getElementById("content").appendChild(li);
});

connection.start().then(function () {

}).catch(function (err) {
})

function sendMsg() {
    var msg = document.getElementById('txt').value;
    connection.invoke("SendMessage", msg, "xiaoqiu");
    //connection.stop();
}
复制代码

开了两个浏览器访问,基本的效果如图:

.net core SignalR——服务器实时消息推送

到这里,我们完全可以做一个聊天室了,当然,需要优化的地方会更多了

Controller中调用SignalR服务

在构造函数注入 IHubContext<> 就可以直接使用了,非常方便:

private readonly IHubContext<TestHub> _hubContext;

    public HomeController(IHubContext<TestHub> hubContext)
    {
        _hubContext = hubContext;
    }
    
    public async Task<IActionResult> Notify()
    {
        //拿不到当前Hub的clientId  线程是唯一的
        await _hubContext.Clients.All.SendAsync("onMsg", "from controller msg");
        return Ok();
    }
复制代码

一般不直接和客户端进行Hub通信,Controller中调用Hub可以做中转,做多应用接入,自定义功能、权限等等

上一文中,我们显示Excel试试处理进度,大致代码如下:

[HttpPost]
public async Task<JsonResult> Import()
{
    var connectionId = Request.Form["connectionId"].ToString(); //拿到当前连接的Id
    var importer = new ExcelImporter();
    //自定义的委托,处理业务的参数
    importer.OnImportingEvent += (sender, arg) =>
    {
        var response = new
        {
            isSuccess = arg.IsSuccess,          //当前数据行是否处理(导入转换)成功
            total = arg.TotalRow,               //当前导入的数据总行数
            rowNumber = arg.RowNumber,          //当前处理的行数
            msg = arg.Msg,                      //处理消息
            time = arg.Time,                    //处理时间
            isComplete = false                  //是否全部处理(转换)完毕
        };
        //推送消息,通知到客户端
        _globalHub.InvokeByIDAsync(connectionId, "importMessage", response);
    };
}

//前端的connection处理,监听对应的方法
connection.on('importMessage',function(notice){
    //根据返回的参数进行相应的逻辑处理展示...
})
复制代码

到这里, SignalR 的基本用法已经介绍完毕,欢迎补充!

.net core SignalR——服务器实时消息推送

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

现代编译原理

现代编译原理

(美)安佩尔 / 赵克佳、黄春、沈志宇 / 人民邮电出版社 / 2006-4 / 45.00元

《现代编译原理:C语言描述》全面讲述了现代编译器的结构、编译算法和实现方法,是Andrew w.Apple的“虎书”——Modern Compiler Implementation——“红、蓝、绿”三序列之一。这三本书的内容基本相同。但是使用不同的语言来实现书中给出的一个编译器。本书使用的是更适合广大读者的c语言,而另外两本书分别采用ML语言和Java语言。本书的另一个特点是增加了一些其他编译原理......一起来看看 《现代编译原理》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具