Ejemplo n.º 1
0
        public async Task <HttpResponseMessage> MakeRequest(HttpClientMethod method, string apiEndpoint, object requestObject = null)
        {
            var jsonString  = requestObject == null ? null : Newtonsoft.Json.JsonConvert.SerializeObject(requestObject);
            var jsonContent = new StringContent(jsonString ?? "", System.Text.Encoding.UTF8, "application/json");

            Func <HttpClient, Task <HttpResponseMessage> > requestTask = null;

            switch (method)
            {
            case HttpClientMethod.Get:
                requestTask = client => client.GetAsync(apiEndpoint);
                break;

            case HttpClientMethod.Post:
                requestTask = client => client.PostAsync(apiEndpoint, jsonContent);
                break;

            case HttpClientMethod.Put:
                requestTask = client => client.PutAsync(apiEndpoint, jsonContent);
                break;

            case HttpClientMethod.Delete:
                requestTask = client => client.DeleteAsync(apiEndpoint);
                break;
            }

            return(await requestTask(HttpClient).ConfigureAwait(false));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Internally make and translate the request to the Transport
        /// </summary>
        /// <typeparam name="TResponse"> Response Type</typeparam>
        /// <param name="method">HTTP Method</param>
        /// <param name="apiUrl"></param>
        /// <param name="requestObj"></param>
        /// <returns></returns>
        internal async Task <CommunicationResult <TResponse> > InternalRequest <TResponse>(HttpClientMethod method, string apiUrl, object requestObj)
        {
            var returnResult = new CommunicationResult <TResponse>
            {
                DateSent = DateTime.Now
            };

            try
            {
                var response = await HttpClientTransport.MakeRequest(method, apiUrl, requestObj).ConfigureAwait(false);

                string responseContentString = null;
                if (response.Content.Headers.ContentLength > 0)
                {
                    responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false); // Read this regardless of response
                }
                if (response.IsSuccessStatusCode)
                {
                    returnResult.Status = CommunicationStatus.Success;
                    // Don't wrap this, if it throws it will (rightfully) fall to ClientError
                    if (typeof(TResponse) == typeof(string))
                    {
                        returnResult.Data = (TResponse)Convert.ChangeType(responseContentString, typeof(TResponse));
                    }
                    else
                    {
                        var deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject <TResponse>(responseContentString);
                        returnResult.Data = deserialized;
                    }
                }
                else
                {
                    returnResult.Status    = CommunicationStatus.RemoteError;
                    returnResult.Exception = GetRemoteException(response.StatusCode, response.ReasonPhrase, response.Headers, responseContentString);
                }
            }
            // Catch timeouts specifically
            catch (TaskCanceledException ex)
            {
                if (ex.CancellationToken.IsCancellationRequested)
                {
                    // Cancelled by implementation
                    returnResult.Status    = CommunicationStatus.ClientError;
                    returnResult.Exception = ex;
                }
                else
                {
                    // HTTP Transport Timeout
                    returnResult.Status = CommunicationStatus.Timeout;
                }
            }
            catch (Exception ex)
            {
                returnResult.Status    = CommunicationStatus.ClientError;
                returnResult.Exception = ex;
            }
            finally
            {
                returnResult.DateReturned = DateTime.Now;
            }
            return(returnResult);
        }