在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);
如何创建自定义错误响应?
答案 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
为假时返回相同的响应。