signalr服务端-基础搭建
signalr 支持 iis托管、winform、windowsservices、wpf 托管 这里我采用winfrom托管
首先画一个这样的窗体

在服务项目通过项目管理包安装signalr类库

安装后 如果客户端是web程序 则将js移动到客户端 编写客户端的时候使用

这次我安装缺少一个
程序集 我在官网下载手动引用上去了
新建一个类 该类用于自定义找到signalr回话的id 默认是随机的一个guid维护。。实现这个类 就可以根据用户id 直接发送给指定用户
/// <summary>
/// 自定义维护每个用户会话id的实现类
/// </summary>
public class UserIdProvider:IUserIdProvider
{
public string GetUserId(IRequest request)
{
return request.QueryString["Uid"];
}
}
新建一个signalr启动类。并将自定义维护会话注入
public class Startup
{
public void Configuration(IAppBuilder app)
{
//注入signlar自定义维护会话id
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new UserIdProvider());
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
新建一个服务器的在线用户信息管理类
/// <summary>
/// 在线用户信息管理类
/// </summary>
public class User
{
/// <summary>
/// 用户id
/// </summary>
public string Uid { get; set; }
/// <summary>
/// 用户名字
/// </summary>
public string UName { get; set; }
/// <summary>
/// 上线时间
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// 头像
/// </summary>
public string HeadPath { get; set; }
/// <summary>
/// 当前用户所在机构id
/// </summary>
public string OrganId{ get; set; }
/// <summary>
/// 当前用户所在部门id
/// </summary>
public string Depid { get; set; }
}
引入redis客户端 消息队列管理以及在线用户管理
编写接口层 如果不使用redis可以切换成其他存储
public interface IDeposit
{
Task<bool> RemoveKey(string key);
Task<bool> SetAsync(string key, object value, TimeSpan? timeOut = null);
Task<T> GetAsync<T>(string key);
Task<bool> ListLeftPush(string key, object value, TimeSpan? ts = null);
Task<bool> ListRightPush(string key, object value, TimeSpan? ts = null);
Task<T> ListLeftPop<T>(string key);
Task<T> ListRightPop<T>(string key);
bool HashSet(string keyA, string keyB, object value);
T HashGet<T>(string keyA, string keyB);
}
}
编写实现层
public class RedisManager:IDeposit
{
private ConnectionMultiplexer _redis;
private object _locker = new object();
public ConnectionMultiplexer Manager
{
get
{
if (_redis == null)
{
lock (_locker)
{
if (_redis != null) return _redis;
_redis = GetManager();
return _redis;
}
}
return _redis;
}
}
public IDatabase DB
{
get
{
return Manager.GetDatabase();
}
}
private ConnectionMultiplexer GetManager()
{
ConfigurationOptions co = new ConfigurationOptions()
{
EndPoints =
{
{ConfigHelper.GetRedisIp, ConfigHelper.GetRedisPort }
}
};
return ConnectionMultiplexer.Connect(co);
}
public async Task<bool> RemoveKey(string key)
{
return await DB.KeyDeleteAsync(key);
}
public async Task<bool> SetAsync(string key, object value, TimeSpan? timeOut=null)
{
Type t = value.GetType();
bool isOk;
if (t.IsClass && t != typeof(string))
{
var str = JsonConvert.SerializeObject(value);
isOk = Manager.GetDatabase().StringSet(key, str);
}
else
{
isOk = Manager.GetDatabase().StringSet(key,value.ToString());
}
//设置key的失效时间
if (isOk && timeOut != null)
{
DB.KeyExpire(key, timeOut);
}
return isOk;
}
public async Task<T> GetAsync<T>(string key)
{
try
{
if (DB.KeyExists(key))
{
Type t = typeof(T);
string str = DB.StringGet(key);
if (t.IsClass&&t!=typeof(string))
{
return JsonConvert.DeserializeObject<T>(str);
}
else
{
return (T)Convert.ChangeType(str, t);
}
}
else
{
return default(T);
}
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 左侧入队
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="ts"></param>
/// <returns></returns>
public async Task<bool> ListLeftPush(string key,object value,TimeSpan?ts=null) {
Type t = value.GetType();
bool isOk;
long oldLength = DB.ListLength(key);
;
if (t.IsClass && t != typeof(string))
{
var str = JsonConvert.SerializeObject(value);
length = DB.ListLeftPush(key, str);
}else{
length = DB.ListLeftPush(key, value.ToString());
}
isOk=oldLength < length;
//设置key的失效时间
if (isOk && ts != null)
{
DB.KeyExpire(key, ts);
}
return isOk;
}
//右侧入队
public async Task<bool> ListRightPush(string key, object value, TimeSpan? ts = null)
{
Type t = value.GetType();
bool isOk;
long oldLength = DB.ListLength(key);
;
if (t.IsClass && t != typeof(string))
{
var str = JsonConvert.SerializeObject(value);
length = DB.ListRightPush(key, str);
}
else
{
length = DB.ListRightPush(key, value.ToString());
}
isOk= oldLength < length;
//设置key的失效时间
if (isOk && ts != null)
{
DB.KeyExpire(key, ts);
}
return isOk;
}
/// <summary>
/// 左侧出队
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public async Task<T> ListLeftPop<T>(string key)
{
Type t = typeof(T);
if (DB.KeyExists(key))
{
var values = DB.ListLeftPop(key);
if (t.IsClass && t != typeof(string))
{
return JsonConvert.DeserializeObject<T>(values); ;
}
else
{
return (T)Convert.ChangeType(values, t);
}
}
else
{
return default(T);
}
}
/// <summary>
/// 右侧出队
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public async Task<T> ListRightPop<T>(string key)
{
Type t = typeof(T);
if (DB.KeyExists(key))
{
var values = DB.ListRightPop(key);
if (t.IsClass && t != typeof(string))
{
return JsonConvert.DeserializeObject<T>(values); ;
}
else
{
return (T)Convert.ChangeType(values, t);
}
}
else
{
return default(T);
}
}
public bool HashSet(string keyA, string keyB, object value)
{
if (DB == null) return false;
var t = value.GetType();
bool isOk;
if (t.IsClass && t != typeof(string))
{
var str = JsonConvert.SerializeObject(value);
isOk= DB.HashSet(keyA, keyB, str);
}
else
{
isOk= DB.HashSet(keyA,keyB, value.ToString());
}
return isOk;
}
public T HashGet<T>(string keyA, string keyB)
{
if (DB == null) return default(T);
var t = typeof(T);
var values = DB.HashGet(keyA,keyB);
if (string.IsNullOrEmpty(values)) return default(T);
if (t.IsClass && t != typeof(string))
{
return JsonConvert.DeserializeObject<T>(values); ;
}
else
{
return (T)Convert.ChangeType(values, t);
}
}
}
编写帮助类
public class DepositHelper
{
public static IDeposit rm = new RedisManager();
public Task<bool> RemoveKey(string key)
{
return rm.RemoveKey(key);
}
public static Task<bool> SetAsync(string key, object value, TimeSpan? timeOut = null)
{
return rm.SetAsync(key, value, timeOut);
}
public static Task<T> GetAsync<T>(string key)
{
return rm.GetAsync<T>(key);
}
public static Task<bool> ListLeftPush(string key, object value, TimeSpan? ts = null)
{
return rm.ListLeftPush(key, value, ts);
}
public static Task<bool> ListRightPush(string key, object value, TimeSpan? ts = null)
{
return rm.ListRightPush(key, value, ts);
}
public static Task<T> ListLeftPop<T>(string key)
{
return rm.ListLeftPop<T>(key);
}
public static Task<T> ListRightPop<T>(string key)
{
return rm.ListRightPop<T>(key);
}
public static bool HashSet(string keyA, string keyB, object value)
{
return rm.HashSet(keyA, keyB, value);
}
public static T HashGet<T>(string keyA, string keyB)
{
return rm.HashGet<T>(keyA, keyB);
}
}
编写在线用户信息管理类
以后再写了
signalr服务端-基础搭建的更多相关文章
- 记录一次SignalR服务端实现过程
前言:最近手上一个项目需要后端实时推送数据到前端,第一个想到的就是微软的SignalR,由于之前都是平时没事写的Demo,没有用到实际项目中,这次恰好用到了,因此记录下来整个实现过程(网上也有很多类似 ...
- SignalR入门之多平台SignalR服务端
之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...
- 创建自托管的SignalR服务端
微软官方例子地址:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 1.说明: SignalR服务端可 ...
- spring-oauth-server实践:客户端和服务端环境搭建
客户端:http://localhost:8080/spring-oauth-client/index.jsp 服务端:http://localhost:8080/spring-oauth-serve ...
- cocos2d-x开发:服务端基础库封装
元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...
- .net core signalR 服务端强制中断用户连接
.net core signalR 服务端断开连接 { } { } *:first-child { } *:last-child { } { } { } { } { } { } { } { } { } ...
- Node服务端极速搭建 - nvmhome
本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...
- Node服务端极速搭建 -- nvmhome
> 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...
- Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)
一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端, ...
随机推荐
- IOS开发之Bug--遇到一个类型不确定的bug
下面的问题不大,是我在开发中遇到的问题: 然后我就google搜一下这个报错 . 下面就解决了:
- Git 工作流程
Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去.”工作流程”在英语里,叫做”workflow”或者”flow”,原意 ...
- .NET Framework各版本比较
(1)本文比较了.NET Framework多个版本之间的区别,方便各位选择和切换.NET Framework. 版本号 发布日期 Visual Studio的版本 Windows上的默认情况 CLR ...
- Linux命令学习总结:date命令
命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the system date and time 指令所在路径:/bin/date 命令语法: date [OP ...
- 【Linux学习】Linux下用户组、文件权限详解
原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...
- 烂泥:dnsmasq搭建简易DNS服务器
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 今天我们来介绍一个比较简单的DNS服务器dnsmasq.这款软件,已经被我成功使用到公 ...
- Centos下yum安装PHP
添加 yum 源 Centos 6.x 的源 # rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6 ...
- 【小白的CFD之旅】13 敲门实例【续3】
接上文[小白的CFD之旅]12 敲门实例[续2] 4 Results4.1 计算监测图形4.2 Graphics4.2.1 壁面温度分布4.2.2 创建截面4.2.3 显示截面物理量4.2.4 Pat ...
- SSH----小小项目的小小总结
嘛,之前学了一下SSH框架,跟人合作写了个小东西参加比赛,(当然我是队长),真的感慨良多~,现在用这篇博客记录下来吧 1.责任心/责任感 首先要说的一点,要有责任心,当你与别人组成一个团队的时候,虽然 ...
- Linux提权(2)-高级版
当你在攻击受害者的电脑时即使你拥有了一个shell,依然可能会有一些拒绝执行指令的限制.为了获得目标主机的完整控制权限,你需要在未授权的地方绕过权限控制.这些权限可以删除文件,浏览私人信息,或者安装并 ...