/// <summary>
        /// 获取随机字符串
        /// </summary>
        /// <param name="length">字符串长度</param>
        /// <param name="randCodeType">字符类型</param>
        /// <returns>返回生成的字符串</returns>
        /// <example>
        /// <code lang="c#">
        /// <![CDATA[
        ///
        /// string str=StringHelper.GetRandCode(4,RandCodeType.NUMBER|RandCodeType.LETTER);//随机生成4位数字和字母混合字符串
        ///
        /// string num=StringHelper.GetRandCode(6,RandCodeType.NUMBER);//随机生成6位数字
        ///
        /// string str2=StringHelper.GetRandCode(4,RandCodeType.LETTER);//随机生成4位字母字符串
        ///
        /// ]]>
        /// </code>
        /// </example>
        public static string GetRandCode(int length, RandCodeType randCodeType)
        {
            StringBuilder strb         = new StringBuilder();
            long          tick         = DateTime.Now.Ticks;
            Random        rnd          = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
            int           randcodeType = (int)randCodeType;

            for (int i = 0; i < length; i++)
            {
                switch (randcodeType)
                {
                case 1:
                    strb.Append(numArray[rnd.Next(0, numArray.Length)]); break;

                case 2:
                    strb.Append(letterArray[rnd.Next(0, letterArray.Length)]); break;

                case 3:
                    strb.Append(numberAndLetterArray[rnd.Next(0, numberAndLetterArray.Length)]); break;
                }
            }

            return(strb.ToString());
        }
        /// <summary>
        /// 校验验证码
        /// </summary>
        /// <param name="type"></param>
        /// <param name="code"></param>
        /// <param name="token"></param>
        /// <param name="tryIndicator"></param>
        /// <returns></returns>
        public async Task <string> VerifyRandCodeAsync(RandCodeType type, string code, string token, Action <int> tryIndicator = null)
        {
            if (type == RandCodeType.SjRand)
            {
                var    url      = "/passport/captcha/captcha-check";
                var    referUrl = "";
                object data     = new
                {
                    answer     = code,
                    rand       = "sjrand",
                    login_site = "E"
                };

                //var sendDelay

                var result = await RunRequestLoopAsync(
                    _ =>
                {
                    var ctx = Create(
                        HttpMethod.Post,
                        url,
                        referUrl,
                        data,
                        new { result_code = 0, result_message = "" }
                        );
                    if (ApiConfiguration.Instance.EnableVerifycodeSubmitDelay && NetworkConfiguration.Current.VcSubmitDelay > 0)
                    {
                        var delay = NetworkConfiguration.Current.VcSubmitDelay - (int)(DateTime.Now - LastVcLoadTime).TotalMilliseconds;
                        if (delay > 0)
                        {
                            ctx.SendDelay(new TimeSpan(0, 0, 0, 0, delay));
                        }
                    }

                    return(ctx);
                },
                    tryIndicator
                    ).ConfigureAwait(true);

                if (!result.IsValid())
                {
                    return("登录失败,请重试(无法校验验证码)");
                }
                Session.LastCheckRandCodeTime = DateTime.Now;
                if (result.Result.result_code != 4)
                {
                    return(result.Result.result_message ?? "验证码错误");
                }
            }
            else
            {
                var    url      = "passcodeNew/checkRandCodeAnsyn";
                var    referUrl = "";
                object data     = null;

                switch (type)
                {
                case RandCodeType.Randp:
                    referUrl = "confirmPassenger/initDc";
                    data     = new
                    {
                        randCode            = code,
                        rand                = "randp",
                        REPEAT_SUBMIT_TOKEN = token,
                        _json_att           = Session.Attributes
                    }; break;

                case RandCodeType.RandpResign:
                    referUrl = "confirmPassenger/initGc";
                    data     = new
                    {
                        randCode            = code,
                        rand                = "randp",
                        REPEAT_SUBMIT_TOKEN = token,
                        _json_att           = Session.Attributes
                    }; break;

                default:
                    break;
                }

                //var sendDelay

                var result = await RunRequestLoopAsync(
                    _ =>
                {
                    var ctx = Create(
                        HttpMethod.Post,
                        url,
                        referUrl,
                        data,
                        new { data = new { result = 0 } }
                        );
                    if (ApiConfiguration.Instance.EnableVerifycodeSubmitDelay && NetworkConfiguration.Current.VcSubmitDelay > 0)
                    {
                        var delay = NetworkConfiguration.Current.VcSubmitDelay - (int)(DateTime.Now - LastVcLoadTime).TotalMilliseconds;
                        if (delay > 0)
                        {
                            ctx.SendDelay(new TimeSpan(0, 0, 0, 0, delay));
                        }
                    }

                    return(ctx);
                },
                    tryIndicator
                    ).ConfigureAwait(true);

                if (!result.IsValid())
                {
                    return("登录失败,请重试(无法校验验证码)");
                }
                Session.LastCheckRandCodeTime = DateTime.Now;
                if ((result.Result.data?.result ?? 0) == 0)
                {
                    return("验证码错误");
                }
            }


            return(null);
        }
 /// <summary>
 /// 校验验证码
 /// </summary>
 /// <param name="type"></param>
 /// <param name="code"></param>
 /// <param name="token"></param>
 /// <param name="tryIndicator"></param>
 /// <returns></returns>
 public string VerifyRandCode(RandCodeType type, string code, string token, Action <int> tryIndicator = null)
 {
     return(VerifyRandCodeAsync(type, code, token, tryIndicator).Result);
 }