SignalR系列续集[系列6:使用自己的连接ID]
老规矩,前言~,在此先道个歉,之前的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的替换工作.
SignalR确实是一个很好用的东西,无奈国内资料确实很少,有问题可以向我反馈,我会尽量在国外的站上找相关的资料整理成博客,希望SignalR发展的越来越好!
SignalR系列续集[系列6:使用自己的连接ID]的更多相关文章
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- [渣译文] SignalR 2.0 系列:SignalR的服务器广播
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...
- SignalR 2.0 系列: 开始使用SignalR 2.0
这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting S ...
- SignalR 2.0 系列:SignalR的服务器广播
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...
- [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯
原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- [渣译文] SignalR 2.0 系列: SignalR 自托管主机
原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- [渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0
原文:[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP ...
- [渣译文] SignalR 2.0 系列: 支持的平台
原文:[渣译文] SignalR 2.0 系列: 支持的平台 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ASP. ...
- [渣译文] SignalR 2.0 系列: SignalR简介
原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...
随机推荐
- nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...
- 谈谈DOMContentLoaded:Javascript中的domReady引入机制
一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...
- Hawk 4.6 并行化
并行化 Hawk支持单机并行化,也就是使用多线程获取数据.它可以控制目前所有任务的数量,为了不给网站造成过大的压力,仅当任务池中的任务数量小于一定值后,才会插入新的任务. 你可以在数据清洗的 执行面板 ...
- css元素水平居中和垂直居中的方式
关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- JavaScript学习笔记(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
- RMS Server打开或关闭日志记录
原文: https://technet.microsoft.com/zh-cn/library/cc732758 在 Active Directory Rights Management Servic ...
- Kotlin类:功能更强、而更简洁(KAD 03)
作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...
- MySQL 数据库双向同步复制
MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...