用SignalR 2.0开发客服系统 续集[系列6:使用自己的连接ID]

ASP.NET Core2.0使用SignalR和Redis进行实时信息推送 最终效果 准备工作和预备知识 首先先用NuGet包下载SignalR包: Microsoft.AspNetCore.SignalR 安装过后,需要得就是SignalR的JS文件,这里可以采用npm命令进行安装 npm install @aspnet/signalr 这样,在路径下面就会出现两个文件,一个是node_modules文件夹和package-lock.json文件 我们点... 阅读详情
前言

老规矩,前言~,在此先道个歉,之前的1-5对很多细节问题都讲的不是很详细,也有很多人在QQ或者博客问我一些问题

所以,特开了这个续集.. - -, 讲一些大家在开发中遇到的问题和一些解决方案,今天就来说说经常被问到的,如何使用自己定义的连接ID.

之前我们说过,Signalr提供了唯一的连接ID 获取方法:Context.ConnectionId,

那么怎么自己定义这个东西呢? (废话一堆 - - ,),进入主题:

首先,其实在Signalr的前期版本是可以直接自定义Context.ConnectionId,

使用老版本的可以自行查看IConnectionIdGenerator, IConnectionIdFactory 这两个接口.

所以特意说明一下,本博客这里的代码,只适用于Signalr2.0以上版本

 

 

代码环境

开发工具:VS2013   数据库:SQL2008 R2   SignalR版本:2.2

 

 

正文开始

其实在2.0的版本中,SignalR团队为了安全性,已经完全去除了自定义Context.ConnectionId的接口,但是相应的开放了相对安全的IUserIdProvider

废话不多说,直接上代码:

 

首先帐户登陆的代码:

其实就是很传统的登陆代码..把一些用户信息写入到Cookie中而已.黄色为重点

复制代码
    public class UserController : ApiController
    {
        [HttpGet]
        public object Login(string name,string pwd)
        {
           UserInfoBLL bll = new UserInfoBLL();
           if (CacheHelper.Get(name) == null)
           {
               var userinfo = bll.LoginUser(name, pwd);
              
               if (userinfo != null)
               {

                   var context = HttpContext.Current;
                   //帐户信息写入Cookie,自行加密
                   context.Response.Cookies.Add(new HttpCookie(UserEnum.INFO) { Value = JsonConvert.SerializeObject(userinfo) });
//唯一的登陆ID,作为连接ID context.Response.Cookies.Add(new HttpCookie(UserEnum.SignalRID) { Value = userinfo.LoginName });

return new { State=true,Message="登陆成功!"}; } else { return new { State=false,Message="帐户或密码输入错误!"}; } } else { return new { State=false,Message="该帐户已经登陆!"}; } } }
复制代码

 

接下来实现IUserIdProvider:

复制代码
    public class MyUserFactory : IUserIdProvider
    {

        public string GetUserId(IRequest request)
        {
            if (request.GetHttpContext().Request.Cookies[UserEnum.SignalRID] != null)
            {
                return request.GetHttpContext().Request.Cookies[UserEnum.SignalRID].Value;
            }
            return "";
           // return Guid.NewGuid().ToString();
        }
    }
复制代码

以上代码是创建一个MyUserFactory类,继承自IUserIdProvider,实现IUserIdProvider的抽象方法GetUserId

这里的ID我们从Cookies中获取,细心的人应该已经发现了,有个IRequest的参数,所以原则上你可以使用IRequest的各种属性比如QS..你随意..(注:Session暂时无法使用,原因未知)

 

接下来,重点来了..

在Starup中,把我们自定义的MyUserFactory注入到回话设置中..

代码如下(黄色为重点):

复制代码
 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888

            //重点,将MyUserFactory注入
            var userIdProvider = new MyUserFactory();
            GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => userIdProvider);

//设置Webapi var config = new HttpConfiguration(); config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required); app.UseWebApi(config); app.MapSignalR(); } }
复制代码

 

接下来在Hub中添加代码如下:

复制代码
            /// <summary>
            /// 获取连接ID,你可以写成自己的扩展方法,或设置成属性,自行定义
            /// </summary>
            /// <returns></returns>
            public string GetSignalrID()
            {
                if (Context.Request.GetHttpContext().Request.Cookies[UserEnum.SignalRID] != null)
                {
                    return Context.Request.GetHttpContext().Request.Cookies[UserEnum.SignalRID].Value;
                }
                return "";
            }
            //编写发送信息的方法
            public void SendMessage(string message)
            {

                string id = Context.ConnectionId;
                string username = Context.User.Identity.Name;
                var userinfo = JsonConvert.DeserializeObject<UserInfo>(Context.Request.GetHttpContext().Request.Cookies[UserEnum.INFO].Value);
                 var Message = new
                        {
                            name = userinfo.UserName,
                            loadname = userinfo.LoginName,
                            picurl = userinfo.UserPicUrl,
                            time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            message = message
                        };
                       
                        Clients.User(GetSignalrID()).broadcastMessage(Message);
            }
复制代码

说明:重点是标黄色的地方,看过我之前文章的都知道,之前我们的对指定连接对象发送数据,写法为: Clients.Client("连接ID").客户端方法,

这里我们换成了Clients.User("自定义ID"),这样就完成了整个使用自己的连接ID的替换工作.

(附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) (纯手写)基于Vue3.0+vite+.net6+SignalR等技术开发实现的网页端聊天实例项目Aerwen/Chat。实现了发送图文表情消息/gif图、emjoi表情、图片、网址查看、下拉刷新,群聊,好友发送消息...功能等功能。 阅读详情

相关推荐

SignalR连接问题:找不到对应ID的连接

在使用IIS和.NET开发过程中,我们经常会遇到使用SignalR实时通信框架时的连接问题。其中一种常见情况是,当尝试使用特定ID标识的连接时,出现"找不到对应ID的连接"的错误。通过检查连接ID是否正确、处理连接丢失以及正确管理连接,我们可以解决"找不到对应ID的连接"的错误。这些方法可以帮助我们更好地使用SignalR实现可靠的实时通信功能。

Tnp____的博客 754

SignalR系列续集[系列6:使用自己的连接ID]

目录 SignalR系列目录 前言 老规矩,前言~,在此先道个歉,之前的1-5对很多细节问题都讲的不是很详细,也有很多人在QQ或者博客问我一些问题 所以,特开了这个续集.. - -, 讲一些大家在开发中遇到的问题和一些解决方案,今天就来说说经常被问到的,如何使用自己定义的连接ID. 之前我们说过,Signalr提供了唯一的连接ID 获取方法:Context.ConnectionId, ...

weixin_34212762的博客 680

别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系

本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。

weixin_33700350的博客 477

SignalR推送服务,自定義連接id為用戶id

页面代码 服务器消息: var trade; var tradeList = Array(); $(document).ready(function () { $.connection.hub.url = "http://localhost:7754/signalr"; trade = $.co

u011511086的专栏 1740

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1105

手把手教你用CH582的USB0/1双接口玩转CherryUSB协议栈(附完整代码)

本文深入解析CH582双USB接口硬件架构,详细讲解如何通过CherryUSB协议栈实现双接口协同工作,包括中断处理设计、端点资源分配和复合设备描述符配置。提供HID+CDC复合设备实战案例,并分享高级调试技巧与性能优化方法,帮助开发者充分利用CH582的USB0/1双接口潜力。

weixin_42525637的博客 264

SignalR

SignalRSignalR 支持的平台 ASP.NET Core SignalR 支持的平台 SignalR 目录 教程:ASP.NET Core SignalR 入门【添加 SignalR 客户端库】ASP.NET Core SignalR 简介 (GitHub上的SignalR) 在 SignalR 中使用中心 ASP.NET Core(上下文对象、Clients 对象)ASP.NET Core SignalR 配置(配置持有者身份验证、配置客户端选项、配置超时和 keep-alive 选...

KingCruel的专栏 2410

DDR4内存PCB设计实战:8层板Fly-by拓扑信号完整性优化

本文深入探讨了DDR4内存条在8层PCB板上采用Fly-by拓扑时的信号完整性优化实战。文章详细解析了层叠规划、阻抗控制、电源分割、等长布线及串扰抑制等关键设计要点,并强调了仿真验证的重要性,为硬件工程师提供了从理论到实践的完整设计指南与自查清单。

weixin_29296241的博客 340

[ASP.NET Core 3.0学习笔记] - SignalR

SignalR简介 SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Server Sent Events 和 Long Polling作为底层传输方式. SignalR基于这三种技术构建, 抽象于它们之上, 它让你更好的关注业务问题而不是底层传输技术问题. SignalR这个框架分服务器端和客户端, 服务器端支持A...

kyw的专栏 1074

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2145

交货单冲销发货过账的正确姿势:用 VL09 与 ABAP 批量反冲 Goods Issue

摘要 本文详细解析了SAP系统中VL09事务码的技术实现与业务应用。VL09用于反冲发货的货物移动,通过标准冲销路径(移动类型602冲销601)确保单据链路一致、状态机正确回退和业务规则生效。文章对比了经典VL09与Fiori应用在不同SAP产品形态中的位置,并针对STO场景提供了ME23N验证方法。核心内容包括WS_REVERSE_GOODS_ISSUE函数模块的调用要点、必须COMMIT的原因(SAP LUW机制),以及处理Handling Unit等限制条件的注意事项。最后给出了将VL09工程化的项目

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 590

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

1、概述 通过上篇史上最全面的SignalR系列教程-1、认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解。本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然简单,但麻雀虽小五脏俱全。可以以此为基础,扩展到实际应用中。 SignalR 的实现机制与.NET WCF 或 Remoting 是相似的,都是使用远程代理来实现。在具体使用上,有两种不同通信模型:P...

.NET快速开发框架 3652

【YOLO多模态检测顶刊】TGRS 2025范文解读,RGFNet 可见光-红外图像融合目标检测,2026年基于YOLO多模态融合属于发文热点,小论文和大论文通用,通读顶刊了解做实验和论文写作的全流程

🔥本文提出了一种反射率引导的渐进特征对齐网络(RGFNet)用于全天候无人机目标检测。该方法利用Retinex理论从可见光图像中提取光照不变的反射率特征,设计了反射率引导协同对齐模块(RCAM)实现跨模态双向特征对齐,并通过光照感知选择性融合模块(LSFM)在共享状态空间中进行高效特征交互。在DroneVehicle和DVTOD数据集上的实验表明,RGFNet分别达到81.4%和88.5%的mAP,显著优于现有方法。该方法有效解决了低光照条件下可见光-红外图像特征错位问题,为全天候无人机检测提供了新思路。

Ai缝合怪、助力小伙伴高效发论文 1078

大模型Token成本激增?从网关排查到Prompt优化的完整复盘

大模型应用的Token消耗已成为云上成本的关键变量。当接口请求量平稳而账单飙升,问题往往不在模型本身,而在于网关、应用与模型调用之间缺少有效的成本治理。通过请求链路的日志分析与Token用量拆分,可定位到全文拼接、循环调用、缓存命中率低等根因。RAG场景下,段落级切片与重排能大幅压缩Prompt体积;语义缓存和模型路由则可进一步降低重复计算与高单价调用。在Openlaw类法律文本检索平台中,这些方法在保持回答质量的同时,将日均Token消耗降低80%以上。理解Token成本的构成,是每个大模型工程团队必备的

weixin_33912638的博客 415

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 827

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

用SignalR 2.0开发客服系统[系列2:实现聊天室]

前言 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室的功能. 开发环境 开发工具:VS2013 旗舰版 数据库:未用 操作系统:WIN7旗舰版 正文开始 首先我们来看看最终效果: 正式开始: Si

双鱼达摩 1363

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SignalR给指定用户id的用户推送信息

先定义user实体类,每添加一个链接就处理类中对应的数据

兰先生的博客 6078

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: SQL server对Xml字段的操作
下一篇: JS最常用 正则表达式1
双鱼达摩
博客等级 码龄18年 8粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值