Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Task <string> Handle()
        {
            var rlt = Task.Run <string>(() => { return(""); });

            Result = new ApiResult <IResponse> {
                node = XCore.WebNode, code = "-1", success = false, message = "unkown error"
            };
            if (string.IsNullOrEmpty(ApiHost))
            {
                Result.code    = "400";
                Result.message = "request host not set";
            }
            else if (string.IsNullOrEmpty(ApiPath))
            {
                Result.code    = "400";
                Result.message = "request path not set";
            }
            else
            {
                System.Net.Http.HttpClient http = null;
                Task <System.Net.Http.HttpResponseMessage> task = null;
                if (Certificate == null)
                {
                    http = new System.Net.Http.HttpClient();
                }
                else
                {
                    var handler = new System.Net.Http.HttpClientHandler();
                    handler.ClientCertificateOptions = System.Net.Http.ClientCertificateOption.Manual;
                    handler.SslProtocols             = System.Security.Authentication.SslProtocols.Tls12;
                    handler.ClientCertificates.Add(Certificate);
                    http = new System.Net.Http.HttpClient(handler);
                }
                http.BaseAddress = new System.Uri(ApiHost);
                if (Method == "GET")
                {
                    var query = RequestBody as string;
                    if (!string.IsNullOrEmpty(query))
                    {
                        var link = ApiPath.IndexOf('?') < 0 ? '?' : '&';
                        ApiPath += query[0] == '?' || query[0] == '&' ? query : link + query;
                    }
                    if (HttpRequestHeaders != null)
                    {
                        foreach (var kv in HttpRequestHeaders)
                        {
                            http.DefaultRequestHeaders.Add(kv.Key, kv.Value);
                        }
                    }
                    task = http.GetAsync(ApiPath);
                }
                else
                {
                    System.Net.Http.HttpContent content = null;
                    var text  = RequestBody as string;
                    var bytes = RequestBody as byte[];
                    if (bytes != null)
                    {
                        content = new System.Net.Http.ByteArrayContent(bytes);
                    }
                    else if (!string.IsNullOrEmpty(text))
                    {
                        content = new System.Net.Http.StringContent(text, Encoding, ContentType);
                    }
                    else if (RequestBody != null)
                    {
                        content = new System.Net.Http.StringContent(Json.ToString(RequestBody), Encoding, ContentType);
                    }
                    else
                    {
                        content = new System.Net.Http.ByteArrayContent(new byte[0]);
                    }
                    if (HttpRequestHeaders != null)
                    {
                        foreach (var kv in HttpRequestHeaders)
                        {
                            content.Headers.Add(kv.Key, kv.Value);
                        }
                    }
                    task = http.PostAsync(ApiPath, content);
                }

                task.Result.Content.ReadAsStringAsync().ContinueWith((res) =>
                {
                    ResponseBody        = res.Result;
                    HttpResponseHeaders = new Dictionary <string, string>();
                    foreach (var item in task.Result.Headers)
                    {
                        var em = item.Value.GetEnumerator();
                        if (em.MoveNext())
                        {
                            HttpResponseHeaders.Add(item.Key.ToLower(), em.Current);
                        }
                    }
                    rlt = Task.Run <string>(() => { return(res.Result); });
                }).Wait();
            }
            return(rlt);
        }