/// <summary>
        /// Sends an HTTP get request to cluster http gateway.
        /// </summary>
        /// <param name="requestFunc">Func to create HttpRequest to send.</param>
        /// <param name="relativeUri">The relative URI.</param>
        /// <param name="requestId">Request Id for corelation</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The payload of the GET response.</returns>
        /// <exception cref="ServiceFabricException">When the response is not a success.</exception>
        private async Task <HttpResponseMessage> SendAsyncHandleUnsuccessfulResponse(
            Func <HttpRequestMessage> requestFunc,
            string relativeUri,
            string requestId,
            CancellationToken cancellationToken)
        {
            var response = await this.SendAsyncHandleSecurityExceptions(relativeUri, requestId, requestFunc, cancellationToken);

            if (response.IsSuccessStatusCode)
            {
                return(response);
            }

            var message = string.Format(
                SR.ErrorHttpOperationUnsuccessfulFormatString,
                relativeUri,
                response.StatusCode,
                response.ReasonPhrase,
                response.RequestMessage);

            ServiceFabricHttpClientEventSource.Current.ErrorResponse($"{this.ClientId}:{requestId}", message);

            if (response.Content != null)
            {
                FabricError error = null;

                try
                {
                    var contentStream = await response.Content.ReadAsStreamAsync();

                    using (var streamReader = new StreamReader(contentStream))
                    {
                        using (var reader = new JsonTextReader(streamReader))
                        {
                            error = FabricErrorConverter.Deserialize(reader);
                        }
                    }
                }
                catch (JsonReaderException)
                {
                    throw new ServiceFabricException(
                              $"Server returned error while processing the request but did not provide a meaningful error response. Response Error Code {response.StatusCode}");
                }

                if (error != null)
                {
                    throw new ServiceFabricException($"{error.Error.Code.ToString()}. {error.Error.Message}");
                }
            }
            else
            {
                throw new ServiceFabricException(
                          $"Server returned error while processing the request but did not provide a meaningful error response. Response Error Code {response.StatusCode}");
            }

            return(response);
        }
Пример #2
0
        /// <summary>
        /// Sends an HTTP get request to cluster http gateway.
        /// </summary>
        /// <param name="requestFunc">Func to create HttpRequest to send.</param>
        /// <param name="requestUri">Request Uri.</param>
        /// <param name="clientRequestId">Request Id for corelation</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The payload of the GET response.</returns>
        /// <exception cref="ServiceFabricException">When the response is not a success.</exception>
        private async Task <HttpResponseMessage> SendAsyncHandleUnsuccessfulResponse(
            Func <HttpRequestMessage> requestFunc,
            Uri requestUri,
            string clientRequestId,
            CancellationToken cancellationToken)
        {
            HttpRequestMessage FinalRequestFunc()
            {
                var request = requestFunc.Invoke();

                request.RequestUri = requestUri;

                // Add claims token to request if needed.
                this.bearerTokenHandler.AddTokenToRequest(request);

                // Add client request id to header for corelation on server.
                request.Headers.Add(Constants.ServiceFabricHttpRequestIdHeaderName, $"{clientRequestId}");
                request.Headers.Add(Constants.ServiceFabricHttpClientTypeHeaderName, $"{this.ClientTypeHeaderValue}");
                return(request);
            }

            var response = await this.SendAsyncHandleSecurityExceptions(FinalRequestFunc, clientRequestId, cancellationToken);

            if (response.IsSuccessStatusCode)
            {
                return(response);
            }

            // Continue with handling the unsuccessful response.
            var message = string.Format(
                SR.ErrorHttpOperationUnsuccessfulFormatString,
                requestUri.ToString(),
                response.StatusCode,
                response.ReasonPhrase,
                response.RequestMessage);

            ServiceFabricHttpClientEventSource.Current.ErrorResponse($"{clientRequestId}", message);

            // Try to get Fabric Error Code if present in response body.
            if (response.Content != null)
            {
                FabricError error = null;

                try
                {
                    var contentStream = await response.Content.ReadAsStreamAsync();

                    if (contentStream.Length != 0)
                    {
                        using (var streamReader = new StreamReader(contentStream))
                        {
                            using (var reader = new JsonTextReader(streamReader))
                            {
                                error = FabricErrorConverter.Deserialize(reader);
                            }
                        }
                    }
                }
                catch (JsonReaderException ex)
                {
                    ServiceFabricHttpClientEventSource.Current.ErrorMessage($"{clientRequestId}", $"Request Url: {requestUri} JsonReaderException: {ex.ToString()}");
                    throw new ServiceFabricException(string.Format(SR.ServerErrorNoMeaningFulResponse, response.StatusCode));
                }

                if (error != null)
                {
                    throw new ServiceFabricException(error.Message, error.ErrorCode ?? FabricErrorCodes.UNKNOWN, false);
                }
                else
                {
                    // Handle NotFound 404, without any ErrorCode.
                    if (response.StatusCode.Equals(HttpStatusCode.NotFound))
                    {
                        throw new ServiceFabricException(SR.ErrorMessageHTTP404, FabricErrorCodes.FABRIC_E_DOES_NOT_EXIST, false);
                    }
                }
            }

            // Couldn't determine FabricError code, throw exception with status code.
            throw new ServiceFabricException(string.Format(SR.ServerErrorNoMeaningFulResponse, response.StatusCode));
        }