Beispiel #1
0
        /// <summary>
        /// 增加Claim
        /// </summary>
        /// <param name="name">Claim名称,名称可以是自定义名称,也可以是已注册名称,参见JwtClaimNames</param>
        /// <param name="value">Claim值</param>
        /// <exception cref="ArgumentNullException" />
        /// <returns>返回当前构造器实例</returns>
        public JwtBuilder AddClaim(string name, object value)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (name.Equals(JwtClaimNames.ExpirationTime.ToStr())) // 设置过期时间
            {
                int seconds = ObjectConvert.C2Int(value);
                if (seconds > 0)
                {
                    value = DateTime.Now.AddSeconds(seconds).ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
                }
                else
                {
                    value = DateTime.Now.AddHours(2).ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
                }
                _payload.Add(name, value);
            }
            else if (value is DateTime dt) // 格式化成标准时间
            {
                _payload.Add(name, dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
            }
            else
            {
                _payload.Add(name, value);
            }

            return(this);
        }
Beispiel #2
0
        /// <summary>
        /// 读取一个大容量字符串(Bulk Strings)
        /// </summary>
        /// <param name="bs"></param>
        /// <returns></returns>
        private byte[] ReadBlock(Stream bs)
        {
            /*
             * 示例:
             * $6\r\n
             * foobar\r\n
             */

            var len = ObjectConvert.C2Int(ReadLine(bs)); // 读取长度

            if (len > 0)
            {
                var buf   = new byte[len];
                var count = bs.Read(buf, 0, len); // 读取数据
                if (count > 0)
                {
                    bs.ReadByte(); // 丢弃"\r"
                    bs.ReadByte(); // 丢弃"\n"
                    return(buf);
                }
            }

            return(default);
Beispiel #3
0
        /// <summary>
        /// 尝试将结果转换成目标类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="result"></param>
        /// <returns></returns>
        private T TryConvertType <T>(object result)
        {
            // 取第一项
            object value;

            if (result is IList <object> rs)
            {
                value = rs.FirstOrDefault();
            }
            else
            {
                value = result;
            }

            // 转换字符串
            if (value is string str)
            {
                try
                {
                    switch (str)
                    {
                    case "OK": return((T)Commands.Ok);

                    case "PONG": return((T)Commands.Ok);
                    }
                    return(TypeConvert.C2Type <T>(str));
                }
                catch (Exception e)
                {
                    throw new RedisClientException($"将字符串({value})转为类型({typeof(T).Name})失败({e.Message})", MethodBase.GetCurrentMethod());
                }
            }

            // 转换字节
            if (value is byte[] byts)
            {
                try
                {
                    object   retVal;
                    TypeCode typeCode = Type.GetTypeCode(typeof(T));
                    switch (typeCode)
                    {
                    case TypeCode.Object: retVal = ObjectConvert.C2Obj <T>(byts); break;

                    case TypeCode.String: retVal = ObjectConvert.C2Str(byts); break;

                    case TypeCode.DateTime: retVal = ObjectConvert.C2Date(byts); break;

                    case TypeCode.Decimal: retVal = ObjectConvert.C2Dec(byts); break;

                    case TypeCode.Double: retVal = ObjectConvert.C2Dbl(byts); break;

                    case TypeCode.Single: retVal = ObjectConvert.C2Flt(byts); break;

                    case TypeCode.Int64: retVal = ObjectConvert.C2Lng(byts); break;

                    case TypeCode.Int32: retVal = ObjectConvert.C2Int(byts); break;

                    case TypeCode.Int16: retVal = ObjectConvert.C2Short(byts); break;

                    case TypeCode.UInt64: retVal = ObjectConvert.C2Lng(byts); break;

                    case TypeCode.UInt32: retVal = ObjectConvert.C2Int(byts); break;

                    case TypeCode.UInt16: retVal = ObjectConvert.C2Short(byts); break;

                    case TypeCode.Byte: retVal = ObjectConvert.C2Byte(byts); break;

                    case TypeCode.SByte: retVal = ObjectConvert.C2SByte(byts); break;

                    case TypeCode.Char: retVal = ObjectConvert.C2Chr(byts); break;

                    case TypeCode.Boolean: retVal = ObjectConvert.C2Bool(byts); break;

                    default: retVal = TypeConvert.C2Type <T>(byts); break;
                    }
                    return((T)retVal);
                }
                catch (Exception e)
                {
                    throw new RedisClientException($"将结果转换成类型({typeof(T).Name})失败({e.Message})", MethodBase.GetCurrentMethod());
                }
            }

            return(default);