/// <summary> /// in case of a failure will enqueue the failed request again /// </summary> /// <param name="task">the task that handled the request</param> /// <param name="state">the original request object</param> private void HandleResponse(Task <HttpResponseMessage> task, object state) { Interlocked.Decrement(ref pending); if (!task.IsCompleted || task.Status != TaskStatus.RanToCompletion) { Retry(state as QueueRequest); OnRequestError?.Invoke(task.Exception, task.Status == TaskStatus.Canceled); } else if ((int)task.Result.StatusCode >= 300) { Retry(state as QueueRequest); OnHttpError?.Invoke(task.Result.StatusCode); } else { OnRequestSent?.Invoke(); } }
private void throwOnErrorStatus(OnHttpError handler, HttpResponseMessage response, string reply) { if (response.IsSuccessStatusCode) { return; } var request = response.RequestMessage; var statusCode = (int)response.StatusCode; var requestHeaders = from header in request.Headers let values = header.Value.Select(value => $"'{value}'") select $"{header.Key}: {string.Join(";", values)}"; var responseHeaders = from header in response.Headers let values = header.Value.Select(value => $"'{value}'") select $"{header.Key}: {string.Join(";", values)}"; var detail = new WebApiExceptionDetail { statusCode = response.StatusCode, isSuccessfull = response.IsSuccessStatusCode, reason = response.ReasonPhrase, request = new WebApiExceptionDetail.Request { method = request.Method.Method, url = request.RequestUri.ToString(), headers = requestHeaders.ToArray() }, response = new WebApiExceptionDetail.Response { headers = responseHeaders.ToArray(), text = reply } }; handler?.Invoke(detail); throw new WebApiException($"Bad http status code {statusCode}", detail); }
/// <summary> /// 触请求过程中发生错误事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void HttpError(object sender, Exception e) { OnHttpError?.Invoke(sender, e); }