博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SignalR系列续集[系列6:使用自己的连接ID]
阅读量:6982 次
发布时间:2019-06-27

本文共 4617 字,大约阅读时间需要 15 分钟。

原文:

目录

前言

老规矩,前言~,在此先道个歉,之前的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中添加代码如下:

///             /// 获取连接ID,你可以写成自己的扩展方法,或设置成属性,自行定义            ///             /// 
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
(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的替换工作.

 

 

写在最后

SignalR确实是一个很好用的东西,无奈国内资料确实很少,有问题可以向我反馈,我会尽量在国外的站上找相关的资料整理成博客,希望SignalR发展的越来越好!

转载地址:http://vlvpl.baihongyu.com/

你可能感兴趣的文章
5G频谱相争“兵戎相见”各相部署风起云涌
查看>>
安全自动化在于信任,而非技术
查看>>
缘何Square可以在移动支付领域上成功?
查看>>
云计算从“仰望星空”到“脚踏实地”
查看>>
台积电要造第一款7nm芯片 明年下半年可投产
查看>>
《逻辑与计算机设计基础(原书第5版)》——3.9 二进制加法器
查看>>
《中国人工智能学会通讯》——8.25 基于演化优化的生物网络配准
查看>>
飞鹤乳业CIO:移动化让企业品牌和消费者紧密连接
查看>>
当精准广告遇到大数据
查看>>
《机器人自动化:建模、仿真与控制》——2.3 仿真
查看>>
泰一指尚大数据应用成为第一批省级重点企业研究院
查看>>
预测未来 盘点大数据分析领域五大趋势
查看>>
教你编写Node.js中间件,实现服务端缓存
查看>>
又到中元节 应用宝教你如何打败各种鬼
查看>>
资源大集中 浪潮I9000刀片为国家税务总局打造全能型平台
查看>>
PC如何接管手机的双因子身份验证 靠的是英特尔的CPU
查看>>
分析:“AI on Hadoop”有意义吗?
查看>>
起底英特尔大数据
查看>>
《中国人工智能学会通讯》——11.65 双重代价敏感的属性分类模型
查看>>
阿里云人工智能ET夺肺结节诊断世界冠军
查看>>