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服务端-基础搭建的更多相关文章

  1. 记录一次SignalR服务端实现过程

    前言:最近手上一个项目需要后端实时推送数据到前端,第一个想到的就是微软的SignalR,由于之前都是平时没事写的Demo,没有用到实际项目中,这次恰好用到了,因此记录下来整个实现过程(网上也有很多类似 ...

  2. SignalR入门之多平台SignalR服务端

    之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...

  3. 创建自托管的SignalR服务端

    微软官方例子地址:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 1.说明: SignalR服务端可 ...

  4. spring-oauth-server实践:客户端和服务端环境搭建

    客户端:http://localhost:8080/spring-oauth-client/index.jsp 服务端:http://localhost:8080/spring-oauth-serve ...

  5. cocos2d-x开发:服务端基础库封装

    元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...

  6. .net core signalR 服务端强制中断用户连接

    .net core signalR 服务端断开连接 { } { } *:first-child { } *:last-child { } { } { } { } { } { } { } { } { } ...

  7. Node服务端极速搭建 - nvmhome

    本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...

  8. Node服务端极速搭建 -- nvmhome

    > 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...

  9. Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)

    一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端, ...

随机推荐

  1. 使用Filter跟踪Asp.net MVC页面加载时间

    最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢.这种问题就像是幽灵一样,非常不好处理.因为导致这种问题的因素非常之多,而且在开发工程中,很难模拟出实际运行是的环境 ...

  2. 不能在DropDownList 中选择多个项

    在绑定DropDownList时如果出现多次绑定,会出错以下错误: “不能在DropDownList 中选择多个项” 经了解,只需要在选中值是清空选择即可:xxDropDownList.ClearSe ...

  3. ORACLE字符集基础知识

    概念描叙    ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需要设置的.国家 ...

  4. Linux查看关机时间

    在Linux系统中,如何查看系统什么时候执行了shutdown命令关闭服务器了呢? 方法1:使用 last -x|grep shutdown 查看shutdown的历史记录 [root@mylnx20 ...

  5. Tornado框架简析

    Tornado是一款轻量级的Web服务器,同时又是一个开发框架.采用单线程非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. Tornado服务器3大 ...

  6. webapi 控制器接收POST参数时必须以对象的方式接收

    webapi    控制器接收POST参数时必须以对象的方式接收

  7. PostgreSQL-PL/pgSQL

    参考: https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B9%9D%E7%AB%A0 摘记: PL/pgSQL是 ...

  8. register_shutdown_function AND fastcgi_finish_request

    在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和应用场 ...

  9. 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

  10. POJ2104 K-th Number[主席树]【学习笔记】

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51440   Accepted: 17594 Ca ...