예제 #1
0
        public T InvokeSync <T>(string name, RSAApplyScene rsaScene, params object[] methodParams)
        {
            Dictionary <string, string> values = new Dictionary <string, string>();
            string parameterJson;

            if (methodParams != null)
            {
                if (rsaScene.HasFlag(RSAApplyScene.EncryptParameters))
                {
                    parameterJson = Way.Lib.RSA.EncryptByKey(System.Text.Encoding.UTF8.GetBytes(methodParams.ToJsonString()).ToJsonString(), Helper.Exponent, Helper.Modulus);
                }
                else
                {
                    parameterJson = methodParams.ToJsonString();
                }
            }
            else
            {
                parameterJson = "[]";
            }

            HttpClient client = new HttpClient();

            values["m"] = (new InvokeArg
            {
                ClassFullName = "SunRizServer.Controllers.StudioController",
                MethodName = name,
                ParameterJson = parameterJson,
                SessionID = SessionID
            }).ToJsonString();

            var serverUrl  = _config.ServerUrl + "/wayscriptremoting_invoke?a=1";
            var resultTask = client.PostAsync(serverUrl, new FormUrlEncodedContent(values));

            resultTask.Wait();
            var result = resultTask.Result;

            if (result.StatusCode != System.Net.HttpStatusCode.OK)
            {
                throw new Exception(result.ReasonPhrase);
            }
            var responseStringTask = result.Content.ReadAsStringAsync();

            responseStringTask.Wait();
            var responseString = responseStringTask.Result;

            if (responseString.StartsWith("{") == false)
            {
                responseString = Way.Lib.RSA.DecryptContentFromDEncrypt(responseString, Helper.Exponent, Helper.Modulus);
                responseString = responseString.Replace("\\u", "");
                byte[] bs = new byte[responseString.Length / 2];
                for (int i = 0; i < bs.Length; i += 2)
                {
                    bs[i + 1] = (byte)Convert.ToInt32(responseString.Substring(i * 2, 2), 16);
                    bs[i]     = (byte)Convert.ToInt32(responseString.Substring(i * 2 + 2, 2), 16);
                }
                responseString = System.Text.Encoding.Unicode.GetString(bs);
            }

            try
            {
                var response = responseString.ToJsonObject <ResultInfo <T> >();
                if (response.type == WayScriptRemotingMessageType.InvokeError)
                {
                    throw new Exception(response.result.ToSafeString());
                }
                else if (response.type == WayScriptRemotingMessageType.Result)
                {
                    if (response.sessionid != null && response.sessionid.Length > 0)
                    {
                        SessionID = response.sessionid;
                    }
                    return(response.result);
                }
                else
                {
                    throw new Exception(response.result.ToSafeString());
                }
            }
            catch (Exception ex)
            {
                string err = null;
                try
                {
                    var response = responseString.ToJsonObject <ResultInfo <string> >();
                    if (response.result == "请先登录")
                    {
                        //if (Login.instance == null)
                        //{
                        //    Login login = new Login();
                        //    login.Topmost = true;
                        //    if (login.ShowDialog() == true)
                        //    {
                        //        return InvokeSync<T>(name , methodParams);
                        //    }
                        //}
                        //else
                        //{
                        //    while(Login.instance != null)
                        //    {
                        //        System.Windows.Forms.Application.DoEvents();
                        //        System.Threading.Thread.Sleep(10);
                        //    }
                        //    return InvokeSync<T>(name, methodParams);
                        //}
                    }
                    err = response.result.ToSafeString();
                }
                catch (Exception ex2)
                {
                    throw ex;
                }
                if (err != null)
                {
                    throw new Exception(err);
                }
            }

            return(default(T));
        }
예제 #2
0
        public async void Invoke <T>(string name, RSAApplyScene rsaScene, CallbackHandler <T> callback, params object[] methodParams)
        {
            try
            {
                if (name == "Login")
                {
                    Exception err = null;
                    await Task.Run(() => {
                        try
                        {
                            //Helper.Client.Init(out Helper.Exponent, out Helper.Modulus);
                        }
                        catch (Exception ex)
                        {
                            err = ex.InnerException != null ? ex.InnerException : ex;
                        }
                    });

                    if (err != null)
                    {
                        callback(default(T), err.Message);
                        return;
                    }
                }
                Dictionary <string, string> values = new Dictionary <string, string>();
                string parameterJson;
                if (methodParams != null)
                {
                    if (rsaScene.HasFlag(RSAApplyScene.EncryptParameters))
                    {
                        parameterJson = Way.Lib.RSA.EncryptByKey(System.Text.Encoding.UTF8.GetBytes(methodParams.ToJsonString()).ToJsonString(), Helper.Exponent, Helper.Modulus);
                    }
                    else
                    {
                        parameterJson = methodParams.ToJsonString();
                    }
                }
                else
                {
                    parameterJson = "[]";
                }

                //System.Net.WebClient web = new System.Net.WebClient();
                //web.Headers["Content-Type"] = "application/json";
                //byte[] bs = null;
                //await Task.Run(()=>
                //{
                //    bs  = web.UploadData(_ServerUrl, System.Text.Encoding.UTF8.GetBytes((new InvokeM
                //    {
                //        m = new InvokeArg
                //        {
                //            ClassFullName = "SunRizServer.Controllers.StudioController",
                //            MethodName = name,
                //            Parameters = ps,
                //            SessionID = RemotingCookie
                //        }
                //    }).ToJsonString()));

                //});

                //string body = System.Text.Encoding.UTF8.GetString(bs);
                HttpClient client = new HttpClient();
                values["m"] = (new InvokeArg
                {
                    ClassFullName = "SunRizServer.Controllers.StudioController",
                    MethodName = name,
                    ParameterJson = parameterJson,
                    SessionID = SessionID
                }).ToJsonString();

                var serverUrl = _config.ServerUrl + "/wayscriptremoting_invoke?a=1";
                var result    = await client.PostAsync(serverUrl, new FormUrlEncodedContent(values));

                if (result.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    callback(default(T), result.ReasonPhrase);
                    return;
                }
                var responseString = await result.Content.ReadAsStringAsync();

                if (responseString.StartsWith("{") == false)
                {
                    responseString = Way.Lib.RSA.DecryptContentFromDEncrypt(responseString, Helper.Exponent, Helper.Modulus);
                    responseString = responseString.Replace("\\u", "");
                    byte[] bs = new byte[responseString.Length / 2];
                    for (int i = 0; i < bs.Length; i += 2)
                    {
                        bs[i + 1] = (byte)Convert.ToInt32(responseString.Substring(i * 2, 2), 16);
                        bs[i]     = (byte)Convert.ToInt32(responseString.Substring(i * 2 + 2, 2), 16);
                    }
                    responseString = System.Text.Encoding.Unicode.GetString(bs);
                }
                try
                {
                    var response = responseString.ToJsonObject <ResultInfo <T> >();
                    if (response.type == WayScriptRemotingMessageType.InvokeError)
                    {
                        callback(default(T), responseString.ToJsonObject <Newtonsoft.Json.Linq.JToken>().Value <string>("result"));
                    }
                    else if (response.type == WayScriptRemotingMessageType.Result)
                    {
                        if (response.sessionid != null && response.sessionid.Length > 0)
                        {
                            SessionID = response.sessionid;
                        }
                        callback(response.result, null);
                    }
                    else
                    {
                        callback(default(T), responseString.ToJsonObject <Newtonsoft.Json.Linq.JToken>().Value <string>("result"));
                    }
                }
                catch (Exception ex)
                {
                    try
                    {
                        var response = responseString.ToJsonObject <ResultInfo <string> >();

                        if (response.type == WayScriptRemotingMessageType.Result)
                        {
                            if (response.sessionid != null && response.sessionid.Length > 0)
                            {
                                SessionID = response.sessionid;
                            }
                            callback(default(T), null);
                        }
                        else
                        {
                            if (response.result == "请先登录")
                            {
                                //if (Login.instance == null)
                                //{
                                //    Login login = new Login();
                                //    login.Topmost = true;
                                //    if (login.ShowDialog() == true)
                                //    {
                                //        Invoke<T>(name, callback, methodParams);
                                //        return;
                                //    }
                                //}
                                //else
                                //{
                                //    await Task.Run(() =>
                                //    {
                                //        while (Login.instance != null)
                                //            System.Threading.Thread.Sleep(200);
                                //    });
                                //    Invoke<T>(name, callback, methodParams);
                                //    return;
                                //}
                            }

                            Debug.WriteLine($"{name} error:{response.result}");
                            callback(default(T), response.result.ToSafeString());
                        }
                    }
                    catch (Exception ex2)
                    {
                        Debug.WriteLine($"{name} error:{ex.ToString()}");
                        callback(default(T), ex.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                callback(default(T), ex.ToString());
            }
        }