Exemplo n.º 1
0
 public static string DoJsonRequest(string strUri, EnuHttpMethod method, IUriConvertable queryCondition = null, long tick = 0)
 {
     return(DoJsonRequest <object>(strUri, method, null, queryCondition: queryCondition, tick: tick));
 }
Exemplo n.º 2
0
        public static string DoJsonRequest <T>(string strUri, EnuHttpMethod method, T objToSend, IUriConvertable queryCondition = null, long tick = 0) where T : class
        {
            string strToRequest = strUri;

            if (tick != 0 && (method == EnuHttpMethod.Put || method == EnuHttpMethod.Delete))
            {
                strToRequest += "?UpdateTicks=" + tick.ToString(CultureInfo.InvariantCulture);
            }

            if (queryCondition != null && method == EnuHttpMethod.Get)
            {
                strToRequest += queryCondition.QueryString;
            }

            WebRequest requestMsg = WebRequest.Create(strToRequest);

            MakePrincipleHeader(requestMsg, strToRequest);
            requestMsg.ContentType = "application/json";
            requestMsg.Proxy       = null;

            switch (method)
            {
            case EnuHttpMethod.Delete:
                requestMsg.Method = "DELETE";
                break;

            case EnuHttpMethod.Put:
                requestMsg.Method = "PUT";
                break;

            case EnuHttpMethod.Post:
                requestMsg.Method = "POST";
                break;

            default:     //EnuHttpMethod.Get:
                requestMsg.Method = "GET";
                break;
            }

            if (objToSend != null)
            {
                //IsoDateTimeConverter dt = new IsoDateTimeConverter();
                //dt.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
                //string postData = JsonConvert.SerializeObject(objToSend, dt);
                byte[] byteArray;
                if (typeof(T).Name == "List`1")
                {
                    IsoDateTimeConverter dt = new IsoDateTimeConverter();
                    dt.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
                    StringBuilder sb      = new StringBuilder();
                    var           listObj = (IEnumerable)objToSend;
                    sb.Append("DataMetaType=List&");
                    int i = 0;
                    foreach (var item in listObj)
                    {
                        sb.Append("List" + (i++).ToString());
                        sb.Append("=");
                        sb.Append(JsonConvert.SerializeObject(item, dt));
                        sb.Append("&");
                    }
                    sb.Append("DataMetaCount=" + i.ToString());
                    byteArray = Encoding.UTF8.GetBytes(sb.ToString());
                }
                else
                {
                    byteArray = Encoding.UTF8.GetBytes(ParseToString <T>(objToSend));
                }
                requestMsg.ContentType   = "application/x-www-form-urlencoded";
                requestMsg.ContentLength = byteArray.Length;
                Stream dataStream = requestMsg.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();
            }
            HttpWebResponse response           = null;
            string          responseFromServer = "";

            try
            {
                using (response = (HttpWebResponse)requestMsg.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                    {
                        responseFromServer = reader.ReadToEnd();
                    }
                }
            }
            catch (WebException ex)
            {
                response           = (HttpWebResponse)ex.Response;
                responseFromServer = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
                throw new ClientException(responseFromServer, ex, response.StatusCode);
            }
            return(responseFromServer);
        }
        public static T DoJsonRequest <T>(string strUri, EnuHttpMethod method, IUriConvertable queryCondition = null, Object objToSend = null, long tick = 0)
        {
            string strToRequest = strUri;

            if (tick != 0 && (method == EnuHttpMethod.Put || method == EnuHttpMethod.Delete))
            {
                strToRequest += "?UpdateTicks=" + tick.ToString(CultureInfo.InvariantCulture);
            }

            if (queryCondition != null && method == EnuHttpMethod.Get)
            {
                strToRequest += queryCondition.QueryString;
            }

            HttpRequestMessage requestMsg = new HttpRequestMessage();

            MakePrincipleHeader(requestMsg, strToRequest);
            requestMsg.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            requestMsg.RequestUri = new Uri(strToRequest);

            HttpContent content = null;

            if (objToSend != null)
            {
                content = new StringContent(JsonConvert.SerializeObject(objToSend), Encoding.UTF8, "application/json");
            }

            switch (method)
            {
            case EnuHttpMethod.Post:
                requestMsg.Method  = HttpMethod.Post;
                requestMsg.Content = content;
                break;

            case EnuHttpMethod.Put:
                requestMsg.Method  = HttpMethod.Put;
                requestMsg.Content = content;
                break;

            case EnuHttpMethod.Delete:
                requestMsg.Method = HttpMethod.Delete;
                break;

            default:     //EnuHttpMethod.Get:
                requestMsg.Method = HttpMethod.Get;
                break;
            }

            Task <HttpResponseMessage> rtnAll = s_httpClient.SendAsync(requestMsg);

            #region 执行
            HttpResponseMessage resultMessage = null;
            Task <T>            rtnFinal;

            try
            {
                try
                {
                    resultMessage = rtnAll.Result;
                }
                catch (AggregateException ae)
                {
                    foreach (var ex in ae.InnerExceptions)
                    {
                        if (ex is HttpRequestException)
                        {
                            throw new ClientException(ERRMSG_FAILED_TO_SEND_MESSAGE, ex);
                        }
                    }
                }

                if (!resultMessage.IsSuccessStatusCode)
                {
                    Task <WebApiHttpInfo> error;
                    try
                    {
                        error = resultMessage.Content.ReadAsAsync <WebApiHttpInfo>(s_formatters);
                    }
                    catch (Exception ex)
                    {
                        throw new ClientException(ERRMSG_SERVER_EXCEPTIONAL_FAILURE, ex);
                    }
                    throw new ClientException(error.Result.Message);
                }

                if (method != EnuHttpMethod.Get)
                {
                    return(default(T));
                }

                try
                {
                    rtnFinal = resultMessage.Content.ReadAsAsync <T>(s_formatters);
                }
                catch (Exception ex)
                {
                    throw new ClientException(ERRMSG_RESULT_CONTENT_DOESNOT_MATCH, ex);
                }
            }
            catch (ClientException ex)
            {
                ex.ParameterObject = new { Uri = strUri, Method = method, Data = objToSend, Tick = tick };
                throw;
            }

            #endregion

            return(rtnFinal.Result);
        }