/// <summary> /// Create an instance of the service response dto type and inject it with the supplied responseStatus /// </summary> /// <param name="request"></param> /// <param name="responseStatus"></param> /// <returns></returns> public static object CreateResponseDto(object request, ResponseStatus responseStatus) { // Predict the Response message type name var responseDtoType = WebRequestUtils.GetErrorResponseDtoType(request); var responseDto = responseDtoType.CreateInstance(); if (responseDto == null) { return(null); } // For faster serialization of exceptions, services should implement IHasResponseStatus var hasResponseStatus = responseDto as IHasResponseStatus; if (hasResponseStatus != null) { hasResponseStatus.ResponseStatus = responseStatus; } else { var responseStatusProperty = responseDtoType.GetProperty(ResponseStatusPropertyName); if (responseStatusProperty != null) { // Set the ResponseStatus responseStatusProperty.SetProperty(responseDto, responseStatus); } } // Return an Error DTO with the exception populated return(responseDto); }
private void ThrowResponseTypeException <TResponse>(HttpResponseMessage httpRes, object request, string requestUri, object response) { var responseType = WebRequestUtils.GetErrorResponseDtoType <TResponse>(request); Action <HttpResponseMessage, object, string, object> responseHandler; if (!ResponseHandlers.TryGetValue(responseType, out responseHandler)) { var mi = GetType().GetInstanceMethod("ThrowWebServiceException") .MakeGenericMethod(new[] { responseType }); responseHandler = (Action <HttpResponseMessage, object, string, object>)mi.CreateDelegate( typeof(Action <HttpResponseMessage, object, string, object>), this); ResponseHandlers[responseType] = responseHandler; } responseHandler(httpRes, request, requestUri, response); }
private void ThrowResponseTypeException <TResponse>(object request, Exception ex, string requestUri) { if (request == null) { ThrowWebServiceException <TResponse>(ex, requestUri); return; } var responseType = WebRequestUtils.GetErrorResponseDtoType(request); Action <Exception, string> responseHandler; if (!ResponseHandlers.TryGetValue(responseType, out responseHandler)) { var mi = GetType().GetMethod("ThrowWebServiceException", BindingFlags.Instance | BindingFlags.NonPublic) .MakeGenericMethod(new[] { responseType }); responseHandler = (Action <Exception, string>)Delegate.CreateDelegate( typeof(Action <Exception, string>), this, mi); ResponseHandlers[responseType] = responseHandler; } responseHandler(ex, requestUri); }
private void HandleResponseError <TResponse>(Exception exception, AsyncState <TResponse> state) { var webEx = exception as WebException; if (PclExportClient.Instance.IsWebException(webEx)) { var errorResponse = (HttpWebResponse)webEx.Response; Log.Error(webEx); if (Log.IsDebugEnabled) { Log.DebugFormat("Status Code : {0}", errorResponse.StatusCode); Log.DebugFormat("Status Description : {0}", errorResponse.StatusDescription); } var serviceEx = new WebServiceException(errorResponse.StatusDescription) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, ResponseHeaders = errorResponse.Headers }; try { using (var stream = errorResponse.GetResponseStream()) { var bytes = stream.ReadFully(); serviceEx.ResponseBody = bytes.FromUtf8Bytes(); var errorResponseType = WebRequestUtils.GetErrorResponseDtoType <TResponse>(state.Request); if (stream.CanSeek) { PclExport.Instance.ResetStream(stream); serviceEx.ResponseDto = this.StreamDeserializer(errorResponseType, stream); } else //Android { using (var ms = MemoryStreamFactory.GetStream(bytes)) { serviceEx.ResponseDto = this.StreamDeserializer(errorResponseType, ms); } } state.HandleError(serviceEx.ResponseDto, serviceEx); } } catch (Exception innerEx) { // Oh, well, we tried Log.Debug(string.Format("WebException Reading Response Error: {0}", innerEx.Message), innerEx); state.HandleError(default(TResponse), new WebServiceException(errorResponse.StatusDescription, innerEx) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, ResponseHeaders = errorResponse.Headers }); } return; } var authEx = exception as AuthenticationException; if (authEx != null) { var customEx = WebRequestUtils.CreateCustomException(state.Url, authEx); Log.Debug(string.Format("AuthenticationException: {0}", customEx.Message), customEx); state.HandleError(default(TResponse), authEx); } Log.Debug(string.Format("Exception Reading Response Error: {0}", exception.Message), exception); state.HandleError(default(TResponse), exception); CancelAsyncFn = null; }
private Exception HandleResponseError <TResponse>(Exception exception, string url, object request) { var webEx = exception as WebException; if (PclExportClient.Instance.IsWebException(webEx)) { var errorResponse = (HttpWebResponse)webEx.Response; Log.Error(webEx); if (Log.IsDebugEnabled) { Log.Debug($"Status Code : {errorResponse.StatusCode}"); Log.Debug($"Status Description : {errorResponse.StatusDescription}"); } var serviceEx = new WebServiceException(errorResponse.StatusDescription) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, ResponseHeaders = errorResponse.Headers }; try { using var stream = errorResponse.ResponseStream(); var bytes = stream.ReadFully(); serviceEx.ResponseBody = bytes.FromUtf8Bytes(); var errorResponseType = WebRequestUtils.GetErrorResponseDtoType <TResponse>(request); if (stream.CanSeek) { PclExport.Instance.ResetStream(stream); serviceEx.ResponseDto = this.StreamDeserializer(errorResponseType, stream); } else //Android { using var ms = MemoryStreamFactory.GetStream(bytes); serviceEx.ResponseDto = this.StreamDeserializer(errorResponseType, ms); } return(serviceEx); } catch (Exception innerEx) { // Oh, well, we tried Log.Debug($"WebException Reading Response Error: {innerEx.Message}", innerEx); return(new WebServiceException(errorResponse.StatusDescription, innerEx) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, ResponseHeaders = errorResponse.Headers }); } } if (exception is AuthenticationException authEx) { var customEx = WebRequestUtils.CreateCustomException(url, authEx); Log.Debug($"AuthenticationException: {customEx.Message}", customEx); return(authEx); } Log.Debug($"Exception Reading Response Error: {exception.Message}", exception); return(exception); }