/// <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); }
/// <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);
/// <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);