NetCore 下集成SignalR并进行分组处理

Tips:

        1、注意跟普通版Net.MVC的前端处理方式不一样,以前可以connection.start()后直接done里面再做逻辑处理,现在不行了

    建议做法是在具体的业务Hub里重写OnConnectedAsync事件,来为当前连接ID做分组等处理

        2、目前版本只支持了websocket协议,还不支持Comet长连接方式

后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MessengerHub : Hub
{
    private readonly IHttpContextAccessor _accessor;
    public MessengerHub(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
 
    //连上之后初始化Group
    public override async Task OnConnectedAsync()
    {
        var connectionId = Context.ConnectionId;
        var userInfo = _accessor.HttpContext.User.Identities.First(u => u.IsAuthenticated);
        await Task.Run(() =>
        {
            this.Groups.AddAsync(Context.ConnectionId, _accessor.HttpContext.User.Identity.Name);
        });
    }
 
    //给指定Group客户端发送消息
    public async Task SendToMessage(string sendTo, string title, string content, int duration = 3000)
    {
        var connectionId = Context.ConnectionId;
        await Task.Run(() =>
        {
            sendTo.Split(',').ToList().ForEach(t =>
            {
                this.Clients.Group(t).InvokeAsync("SendToMessage", "", title, content, duration);
            });
        });
    }
}

前端代码需要引入signalr-client.js,可以在Bower包里添加或者在Github上找下

前端关键代码:

复制代码
//消息处理
let transportType = signalR.TransportType.WebSockets;
let http = new signalR.HttpConnection(`http://${document.location.host}/messengerHub`, { transport: transportType });
let connection = new signalR.HubConnection(http);
connection.start();

//setTimeout(connection.invoke('AddGroup'), 5000);
connection.on('SendToMessage', (sendTo, title, content, duration) => {
    layer.open({
        type: 1
        , time: duration
        , title: title
        , offset: 'rb'//具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
        //, id: 'LAY_demo_rb' //防止重复弹出
        , content: '<div id="MessageTips">' + content + '</div>'
    });
});
复制代码

注意这个地方注释掉的connection.invoke('AddGroup'),这个地方不能在前台JS里面做分组初始化

前台JS现在也不支持Done方法回调,所以写在了后台OnConnectedAsync方法里

客户端发送方法跟以前的版本不一样:connection.invoke('SendToMessage','Admin','标题','消息提示',2000);

posted @   leeolevis  阅读(2275)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示