/// <summary>异步调用</summary> /// <param name="resultType"></param> /// <param name="action"></param> /// <param name="args"></param> /// <param name="flag"></param> /// <returns></returns> public override Task <Object> InvokeAsync(Type resultType, String action, Object args = null, Byte flag = 0) { if (!ActionPrefix.IsNullOrEmpty() && !action.Contains("/")) { action = ActionPrefix + "/" + action; } return(base.InvokeAsync(resultType, action, args, flag)); }
/// <summary>异步调用</summary> /// <param name="action"></param> /// <param name="args"></param> /// <returns></returns> public override Task <TResult> InvokeAsync <TResult>(String action, Object args = null) { if (!ActionPrefix.IsNullOrEmpty() && !action.Contains("/")) { action = ActionPrefix + "/" + action; } return(base.InvokeAsync <TResult>(action, args)); }
/// <summary>连接后自动登录</summary> /// <param name="client">客户端</param> /// <param name="force">强制登录</param> protected override async Task <Object> OnLoginAsync(ISocketClient client, Boolean force) { if (Logined && !force) { return(null); } Logined = false; var user = UserName; var pass = Password; //if (user.IsNullOrEmpty()) return null; //if (user.IsNullOrEmpty()) throw new ArgumentNullException(nameof(user), "用户名不能为空!"); //if (pass.IsNullOrEmpty()) throw new ArgumentNullException(nameof(pass), "密码不能为空!"); if (!pass.IsNullOrEmpty()) { pass = pass.MD5(); } var arg = new { user, pass, }; // 克隆一份,避免修改原始数据 var dic = arg.ToDictionary(); dic.Merge(GetLoginInfo(), false); var act = "Login"; if (!ActionPrefix.IsNullOrEmpty()) { act = ActionPrefix + "/" + act; } var rs = await base.InvokeWithClientAsync <Object>(client, act, dic); var inf = rs.ToJson(); XTrace.WriteLine("登录{0}成功!{1}", Servers.FirstOrDefault(), inf); Logined = true; Info = rs as IDictionary <String, Object>; if (_timer == null) { _timer = new TimerX(DoPing, null, 10_000, 30_000); } return(rs); }
/// <summary>连接后自动登录</summary> /// <param name="client">客户端</param> /// <param name="force">强制登录</param> protected override async Task <Object> OnLoginAsync(ISocketClient client, Boolean force) { if (Logined && !force) { return(null); } Logined = false; var user = UserName; var pass = Password; //if (user.IsNullOrEmpty()) return null; if (user.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(user), "用户名不能为空!"); } //if (pass.IsNullOrEmpty()) throw new ArgumentNullException(nameof(pass), "密码不能为空!"); var asmx = AssemblyX.Entry; var arg = new { user, pass = pass.MD5(), }; // 克隆一份,避免修改原始数据 var dic = arg.ToDictionary(); dic.Merge(Parameters, false); var act = "Login"; if (!ActionPrefix.IsNullOrEmpty()) { act = ActionPrefix + "/" + act; } var rs = await base.InvokeWithClientAsync <Object>(client, act, dic); var inf = rs.ToJson(); if (Setting.Current.Debug) { XTrace.WriteLine("登录{0}成功!{1}", Servers.FirstOrDefault(), inf); } Logined = true; return(Info = rs as IDictionary <String, Object>); }
/// <summary>调用</summary> /// <typeparam name="TResult"></typeparam> /// <param name="action"></param> /// <param name="args"></param> /// <param name="cookie">附加参数,位于顶级</param> /// <returns></returns> public virtual async Task <TResult> InvokeAsync <TResult>(String action, Object args = null, IDictionary <String, Object> cookie = null) { var ss = Client; if (ss == null) { return(default(TResult)); } // 未登录且设置了用户名,并且当前不是登录,则异步登录 if (!Logined && !UserName.IsNullOrEmpty() && action != "Login") { await LoginAsync(); } var act = action; if (!ActionPrefix.IsNullOrEmpty() && !act.Contains("/")) { act = ActionPrefix.EnsureEnd("/") + act; } LastInvoke = DateTime.Now; try { return(await ApiHostHelper.InvokeAsync <TResult>(this, this, act, args, cookie ?? Cookie)); } catch (ApiException ex) { // 重新登录后再次调用 if (ex.Code == 401) { Logined = false; // 如果当前不是登录,且设置了用户名,尝试自动登录 if (action != "Login" && !UserName.IsNullOrEmpty()) { await LoginAsync(); return(await ApiHostHelper.InvokeAsync <TResult>(this, this, act, args, cookie ?? Cookie)); } } throw; } // 截断任务取消异常,避免过长 catch (TaskCanceledException) { throw new TaskCanceledException(action + "超时取消"); } }