private void HandleResponseError <TResponse>(Exception exception, AsyncState <TResponse> state) { var webEx = exception as WebException; if (webEx.IsWebException()) { var errorResponse = ((HttpWebResponse)webEx.Response); Log.Error(webEx); Log.DebugFormat("Status Code : {0}", errorResponse.StatusCode); Log.DebugFormat("Status Description : {0}", errorResponse.StatusDescription); var serviceEx = new WebServiceException(errorResponse.StatusDescription) { StatusCode = (int)errorResponse.StatusCode, }; try { using (var stream = errorResponse.GetResponseStream()) { //Uncomment to Debug exceptions: //var strResponse = new StreamReader(stream).ReadToEnd(); //Console.WriteLine("Response: " + strResponse); //stream.Position = 0; serviceEx.ResponseBody = stream.ReadFully().FromUtf8Bytes(); stream.ResetStream(); serviceEx.ResponseDto = this.StreamDeserializer(typeof(TResponse), stream); state.HandleError((TResponse)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, }); } 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 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 void ReadCallBack <T>(Task <int> task, AsyncState <T> requestState) { task.ContinueWith(t => { try { var responseStream = requestState.ResponseStream; int read = t.Result; if (read > 0) { requestState.BytesData.Write(requestState.BufferRead, 0, read); var responeStreamTask = responseStream.ReadAsync(requestState.BufferRead, 0, BufferSize); requestState.ResponseBytesRead += read; if (OnDownloadProgress != null) { OnDownloadProgress(requestState.ResponseBytesRead, requestState.ResponseContentLength); } ReadCallBack(responeStreamTask, requestState); return; } Interlocked.Increment(ref requestState.Completed); var response = default(T); try { requestState.BytesData.Position = 0; if (typeof(T) == typeof(Stream)) { response = (T)(object)requestState.BytesData; } else { var reader = requestState.BytesData; try { if (typeof(T) == typeof(string)) { using (var sr = new StreamReader(reader)) { response = (T)(object)sr.ReadToEnd(); } } else if (typeof(T) == typeof(byte[])) { response = (T)(object)reader.ToArray(); } else { response = (T)this.StreamDeserializer(typeof(T), reader); } } finally { if (reader.CanRead) { reader.Dispose(); // Not yet disposed, but could've been. } } } PclExportClient.Instance.SynchronizeCookies(this); requestState.HandleSuccess(response); } catch (Exception ex) { Log.Debug(string.Format("Error Reading Response Error: {0}", ex.Message), ex); requestState.HandleError(default(T), ex); } finally { PclExportClient.Instance.CloseReadStream(responseStream); CancelAsyncFn = null; } } catch (Exception ex) { HandleResponseError(ex, requestState); } }); }