예제 #1
0
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            HttpStatusCode statusCode;

            if (error is SecurityAccessDeniedException)
            {
                statusCode = HttpStatusCode.Unauthorized;
            }
            else if (error is ServerTooBusyException)
            {
                statusCode = HttpStatusCode.ServiceUnavailable;
            }
            else if (CheckIsBizException(error.GetType()))
            {
                statusCode = HttpStatusCode.OK;
            }
            else
            {
                statusCode = HttpStatusCode.InternalServerError;
            }

            RestServiceError errorData = new RestServiceError()
            {
                StatusCode        = (int)statusCode,
                StatusDescription = HttpWorkerRequest.GetStatusDescription((int)statusCode),
                Faults            = new List <Error>()
            };

            if (CheckIsBizException(error.GetType()))
            {
                errorData.Faults.Add(new Error()
                {
                    ErrorCode        = "11111",
                    ErrorDescription = error.Message
                });
            }
            else
            {
                string show       = ConfigurationManager.AppSettings["ShowErrorDetail"];
                bool   showDetail = false;
                bool   tmp;
                if (!string.IsNullOrWhiteSpace(show) && bool.TryParse(show, out tmp))
                {
                    showDetail = tmp;
                }
                errorData.Faults.Add(new Error()
                {
                    ErrorCode        = "00000",
                    ErrorDescription = showDetail ? error.ToString() : "SYSTEM EXCEPTION"
                });
            }

            if (version == MessageVersion.None)
            {
                WebMessageFormat messageFormat = WebOperationContext.Current.OutgoingResponse.Format ?? WebMessageFormat.Xml;
                WebContentFormat contentFormat = WebContentFormat.Xml;
                string           contentType   = "text/xml";

                if (messageFormat == WebMessageFormat.Json)
                {
                    contentFormat = WebContentFormat.Json;
                    contentType   = "application/json";
                }

                WebBodyFormatMessageProperty bodyFormat = new WebBodyFormatMessageProperty(contentFormat);

                HttpResponseMessageProperty responseMessage = new HttpResponseMessageProperty();
                responseMessage.StatusCode        = HttpStatusCode.OK;
                responseMessage.StatusDescription = HttpWorkerRequest.GetStatusDescription((int)responseMessage.StatusCode);
                responseMessage.Headers[HttpResponseHeader.ContentType] = contentType;
                responseMessage.Headers["X-HTTP-StatusCode-Override"]   = "500";

                fault = Message.CreateMessage(MessageVersion.None, null, new RestServiceErrorWriter()
                {
                    Error = errorData, Format = contentFormat
                });
                fault.Properties[WebBodyFormatMessageProperty.Name] = bodyFormat;
                fault.Properties[HttpResponseMessageProperty.Name]  = responseMessage;
            }
        }
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            HttpStatusCode statusCode;
            if (error is SecurityAccessDeniedException)
            {
                statusCode = HttpStatusCode.Unauthorized;
            }
            else if (error is ServerTooBusyException)
            {
                statusCode = HttpStatusCode.ServiceUnavailable;
            }
            else if (CheckIsBizException(error.GetType()))
            {
                statusCode = HttpStatusCode.OK;
            }
            else
            {
                statusCode = HttpStatusCode.InternalServerError;
            }

            RestServiceError errorData = new RestServiceError()
            {
                StatusCode = (int)statusCode,
                StatusDescription = HttpWorkerRequest.GetStatusDescription((int)statusCode),
                Faults = new List<Error>()
            };

            if (CheckIsBizException(error.GetType()))
            {
                errorData.Faults.Add(new Error()
                {
                    ErrorCode = "11111",
                    ErrorDescription = error.Message
                });
            }
            else
            {
                string show = ConfigurationManager.AppSettings["ShowErrorDetail"];
                bool showDetail = false;
                bool tmp;
                if (!string.IsNullOrWhiteSpace(show) && bool.TryParse(show, out tmp))
                {
                    showDetail = tmp;
                }
                errorData.Faults.Add(new Error()
                {
                    ErrorCode = "00000",
                    ErrorDescription = showDetail ? error.ToString() : "SYSTEM EXCEPTION"
                });
            }

            if (version == MessageVersion.None)
            {
                WebMessageFormat messageFormat = WebOperationContext.Current.OutgoingResponse.Format ?? WebMessageFormat.Xml;
                WebContentFormat contentFormat = WebContentFormat.Xml;
                string contentType = "text/xml";

                if (messageFormat == WebMessageFormat.Json)
                {
                    contentFormat = WebContentFormat.Json;
                    contentType = "application/json";
                }

                WebBodyFormatMessageProperty bodyFormat = new WebBodyFormatMessageProperty(contentFormat);

                HttpResponseMessageProperty responseMessage = new HttpResponseMessageProperty();
                responseMessage.StatusCode = HttpStatusCode.OK;
                responseMessage.StatusDescription = HttpWorkerRequest.GetStatusDescription((int)responseMessage.StatusCode);
                responseMessage.Headers[HttpResponseHeader.ContentType] = contentType;
                responseMessage.Headers["X-HTTP-StatusCode-Override"] = "500";

                fault = Message.CreateMessage(MessageVersion.None, null, new RestServiceErrorWriter() { Error = errorData, Format = contentFormat });
                fault.Properties[WebBodyFormatMessageProperty.Name] = bodyFormat;
                fault.Properties[HttpResponseMessageProperty.Name] = responseMessage;
            }
        }