Web Api中的自定义错误响应

时间:2015-05-07 13:09:04

标签: asp.net-web-api

在Web API控制器上,我有以下内容:

if (!ModelState.IsValid)
  return BadRequest();

BadRequest:https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller_methods%28v=vs.118%29.aspx

我想创建一个自定义错误消息以将错误传递为json。

类似的东西:

if (!ModelState.IsValid)
  return ModelHasErrors(errors);

如何创建自定义错误响应?

3 个答案:

答案 0 :(得分:3)

最简单的方法是

return Request.CreateErrorResponse(HttpStatusCode.NotFound, ModelState);

我习惯使用特殊对象,表示错误响应。我可以添加我的特定(已翻译)消息,状态代码等。

public class ErrorModel
{
    public ErrorModel(HttpStatusCode statusCode, string message)
    {
        StatusCode = (int)statusCode;
        Message = message;
        ValidationErrors = new Dictionary<string, ModelErrorCollection>();
    }

    public ErrorModel(HttpStatusCode statusCode)
    {
        StatusCode = (int)statusCode;
        ValidationErrors = new Dictionary<string, ModelErrorCollection>();
    }

    public string Message { get; set; }
    public int StatusCode { get; set; }
    public Dictionary<string, ModelErrorCollection> ValidationErrors { get; set; }
    public Exception Exception { get; set; }
}

然后我有CreateCustomResponse

的扩展名
public static class ApiExtensions
    {
        public static HttpResponseMessage CreateCustomResponse(this HttpRequestMessage request, HttpStatusCode statusCode, string errorMessage)
        {
            var errorMessageModel = new ErrorModel(statusCode, errorMessage);

            return request.CreateResponse(statusCode, errorMessageModel);
        }

        public static HttpResponseMessage CreateCustomResponse(this HttpRequestMessage request, HttpStatusCode statusCode, Exception exception, string errorMessage = "")
        {
            if (string.IsNullOrEmpty(errorMessage) && exception != null)
            {
                errorMessage = exception.Message;
            }

            var errorMessageModel = new ErrorModel(statusCode, errorMessage)
            {
                Exception = exception
            };

            return request.CreateResponse(statusCode, errorMessageModel);
        }

        public static HttpResponseMessage CreateCustomResponse(this HttpRequestMessage request,
            HttpStatusCode statusCode, ModelStateDictionary modelState, string errorMessage = "")
        {
            if (string.IsNullOrEmpty(errorMessage))
            {
                errorMessage = ApiValidationMessages.GeneralModelIsNotValid;
            }

            var errorMessageModel = new ErrorModel(statusCode, errorMessage);

            foreach (var error in modelState.Where(x => x.Value.Errors != null && x.Value.Errors.Any()))
            {
                errorMessageModel.ValidationErrors.Add(error.Key.Replace("model.", ""), error.Value.Errors);
            }

            return request.CreateResponse(statusCode, errorMessageModel);
        }
    }

最后在我的控制器中我只是打电话:

return Request.CreateCustomResponse(HttpStatusCode.NotFound, ApiHttpResultMessages.NotFound);

您可以在我的CodePlex项目中找到灵感 Web API设计https://webapidesign.codeplex.com/

答案 1 :(得分:0)

您可以直接返回您想要的任何对象,它将被序列化为JSON。它甚至可以是使用new { }

创建的匿名类对象

在客户端,您必须检查是否已收到regurlar响应或错误对象,可以通过检查自定义错误对象的某些属性的存在来轻松地进行回复。

答案 2 :(得分:0)

您可以使用包含错误消息的对象(在此示例中为HttpResponseMessage)作为内容返回errors

return new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new ObjectContent(typeof(ErrorClass), errors, new JsonMediaTypeFormatter())
        };

有关如何返回操作结果的详细信息,请参见here

您显然可以通过创建方法重用上述代码,并在示例中调用它:ModelHasErrors(errors)

但是,如果您经常发现自己返回相同的响应,那么一个不错的选择就是创建一个自定义异常过滤器,它会在ModelState.IsValid为假时返回相同的响应。