private HttpResponseMessage Execute()
        {
            var httpResponseMessage = new HttpResponseMessage();

            try
            {
                var negotiationResult = ContentNegotiator.Negotiate(typeof(HttpError), Request, Formatters);

                if (negotiationResult == null)
                {
                    httpResponseMessage.StatusCode = HttpStatusCode.NotAcceptable;
                }
                else
                {
                    var error = new HttpError("Internal Server Error");
                    foreach (var property in Exception.GetCustomProperties())
                    {
                        error.Add(property.Key, property.Value);
                    }

                    httpResponseMessage.StatusCode = HttpStatusCode.InternalServerError;
                    httpResponseMessage.Content    = new ObjectContent <HttpError>(error, negotiationResult.Formatter, negotiationResult.MediaType);
                }

                httpResponseMessage.RequestMessage = Request;
            }
            catch
            {
                httpResponseMessage.Dispose();
                throw;
            }

            return(httpResponseMessage);
        }
Exemplo n.º 2
0
            /// Creates an HttpResponseMessage instance asynchronously. This method determines how a HttpResponseMessage content will look like.
            public override Task <HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
            {
                var result = ContentNegotiator.Negotiate(typeof(HttpError), Request, Formatters);

                var message = new HttpResponseMessage
                {
                    RequestMessage = Request,
                    StatusCode     = result != null ? HttpStatusCode.InternalServerError : HttpStatusCode.NotAcceptable,
                };

                if (result != null)
                {
                    string alert = null;

                    if (Exception is SqlException)
                    {
                        // Strip the beginning of the exception message which contains the name of the stored procedure and the argument values. We do not disclose the values to the client.
                        var index = Exception.Message.IndexOf("::"); // The magic separator used within our stored procedures.
                        if (index >= 0)
                        {
                            alert = Exception.Message.Substring(index + 2).Trim();
                        }
                    }
                    else if (Exception is UserAlertException)
                    {
                        alert = Exception.Message;
                    }
                    // Until we have converted all the exceptions thrown by our code to UserAlertException
                    else
                    {
                        alert = Exception.Message;
                    }

                    var content = new HttpError(Exception, IncludeErrorDetail);

                    if (!String.IsNullOrEmpty(alert))
                    {
                        // Define an additional content field.
                        content.Add("Alert", alert);
                    }

                    // serializes the HttpError instance either to JSON or to XML depend on requested by the client MIME type.
                    message.Content = new ObjectContent <HttpError>(content, result.Formatter, result.MediaType);
                }

                return(Task.FromResult(message));
            }
        private HttpResponseMessage Execute()
        {
            var httpResponseMessage = new HttpResponseMessage();

            try
            {
                var negotiationResult = ContentNegotiator.Negotiate(typeof(HttpError), Request, Formatters);

                if (negotiationResult == null)
                {
                    httpResponseMessage.StatusCode = HttpStatusCode.NotAcceptable;
                }
                else
                {
                    var error = new HttpError("Validation Failed");
                    foreach (var err in _exception.ValidationErrors)
                    {
                        if (!error.ContainsKey(err.ItemName))
                        {
                            error.Add(err.ItemName, new Collection <ApiError>());
                        }

                        ((ICollection <ApiError>)error[err.ItemName]).Add(new ApiError
                        {
                            ErrorCode = err.ErrorCode,
                            Message   = err.ErrorMessage
                        });
                    }

                    httpResponseMessage.StatusCode = HttpStatusCode.BadRequest;
                    httpResponseMessage.Content    = new ObjectContent <HttpError>(error, negotiationResult.Formatter, negotiationResult.MediaType);
                }

                httpResponseMessage.RequestMessage = Request;
            }
            catch
            {
                httpResponseMessage.Dispose();
                throw;
            }

            return(httpResponseMessage);
        }