示例#1
0
        /// <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();
            }
        }
示例#2
0
        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);
        }
示例#3
0
 /// <summary>
 /// 触请求过程中发生错误事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 public void HttpError(object sender, Exception e)
 {
     OnHttpError?.Invoke(sender, e);
 }