我们可以通过以下方式从web api返回带有BadRequest的ModelState:
return BadRequest(ModelState);
它提供以下输出:
{ "Message": "The request is invalid.","ModelState": { "property": [ "error" ] } }
如何以Forbidden状态返回相同的输出?
我试过以下方法:
return Content(HttpStatusCode.Forbidden,ModelState);
但它返回:
{ "property": { "_errors": [ { "<Exception>k__backingField": null,"<ErrorMessage>k__backingField": "error" } ],"<Value>k__backingField": null } }
Json序列化ModelSate也没有返回相同的东西.如何将ModelState的BadRequest()方法使用的序列化方法与其他状态代码一起使用?
解决方法
您可以使用InvalidModelStateResult的ExecuteAsync方法(ApiController的BadRequest()方法的返回类型)来实现所需的输出,该方法实际上序列化了ModelState.
因此,我们的想法是创建一个新类,该类扩展InvalidModelStateResult并覆盖ExecuteAsync方法以更改状态代码.
public class ModelStateResult : InvalidModelStateResult { private readonly HttpStatusCode _status; public ModelStateResult(ModelStateDictionary modelState,ApiController controller,HttpStatusCode status) : base(modelState,controller) { _status = status; } public override Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { var response = base.ExecuteAsync(cancellationToken).Result; response.StatusCode = _status; return Task.Fromresult(response); } }
使用它像:
return new ModelStateResult(ModelState,this,HttpStatusCode.Forbidden); //this refers to ApiController here
编辑:
不使用InvalidModelStateResult:
public class ModelStateResult : IHttpActionResult { public HttpStatusCode Status { get; } public ModelStateDictionary ModelState { get; } public HttpRequestMessage Request { get; } public ModelStateResult(HttpStatusCode status,ModelStateDictionary modelState,HttpRequestMessage request) { Status = status; ModelState = modelState; Request = request; } public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { var response = Request.CreateErrorResponse(Status,ModelState); return Task.Fromresult(response); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。