目录

SignalR系列目录

前言

老规矩,前言~,在此先道个歉,之前的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]的更多相关文章

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. [渣译文] SignalR 2.0 系列:SignalR的服务器广播

    英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...

  3. SignalR 2.0 系列: 开始使用SignalR 2.0

    这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting S ...

  4. SignalR 2.0 系列:SignalR的服务器广播

    英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...

  5. [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯

    原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  6. [渣译文] SignalR 2.0 系列: SignalR 自托管主机

    原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  7. [渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0

    原文:[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP ...

  8. [渣译文] SignalR 2.0 系列: 支持的平台

    原文:[渣译文] SignalR 2.0 系列: 支持的平台 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ASP. ...

  9. [渣译文] SignalR 2.0 系列: SignalR简介

    原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...

随机推荐

  1. ABP文档 - 目录

    ABP框架 概览 介绍 多层结构 模块系统 启动配置 多租户 集成OWIN 共同结构 依赖注入 会话 缓存 日志 设置管理 时间 领域层 实体 值对象(新) 仓储 领域服务 工作单元 领域事件(Eve ...

  2. Dreamweaver 扩展开发:C-level extensibility and the JavaScript interpreter

    The C code in your library must interact with the Dreamweaver JavaScript interpreter at the followin ...

  3. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  4. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

  5. C#使用Aspose.Cells导出Excel简单实现

    首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...

  6. Oracle第一步

    Oracle 启动数据库 Startup [NOMOUNT|MOUNT|OPEN|FORCE] [restrict] [pfile=filename] 启动实例,加载数据库,启动数据库 oRACLE关 ...

  7. BPM公文管理解决方案分享

    一.方案概述 公文作为一种规范性文书,具有法律性.指导性.政令性强的特点,是企事业单位政令上通下达的重要方式.及时.准确.安全地处理.控制和管理公文,方能保障企事业单位正常运转,确保组织权威和政令畅通 ...

  8. Android开发学习—— Fragment

    #Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...

  9. CocoaPods的安装、使用、以及遇到的问题

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...

  10. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...