从WebApi返回自定义错误响应,而不会引发异常

时间:2018-08-15 19:05:19

标签: c# asp.net asp.net-web-api

我想从我的asp.net Web api控制器返回一个自定义响应(ProblemJson),但要在执行控制器本身的方法之前。给定一个看起来像这样的控制器:

[Put]
[Route("api/{userId}")]
public User UpdateUser(Guid userId, [FromBody] user)  
{
     .... 
}

然后我以此来调用api

api/thisIsNoGuid

然后WebApi回答一个我想更改的默认错误消息,以便它与我们定义的ProblemJson的其他错误消息匹配。现在,我们通过引发异常并将它们捕获在为我们生成问题文档的WebApi筛选器中来生成这些问题文档。如果Guid为null,我可以使Guid可为空,并引发异常,因此我们的过滤器可以完成工作,但是我认为这不是一个好主意,因为它将被遗忘并且api不一致。

我想避免这样的代码:

[Put]
[Route("api/{userId}")]
public User UpdateUser(Guid userId, [FromBody] user)  
{
     if (userId == null) return new Error()
     .... 
}

所以我想要的是ExceptionFilters之类的东西,您可以在其中重写OnException方法来创建自己的响应,但是要解决在请求到达控制器之前发生的错误情况。是否可以像这样覆盖WebApi的默认行为?

2 个答案:

答案 0 :(得分:1)

您可以这样做,当您提到-presentDrawable:时,您就关闭了,因为您实际上是使用自定义ExceptionFilter处理这种情况的。像这样:

ActionFilter

如果需要的话,还有一个using System.Web.Http.Filters; public class InterceptBadRequestFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { // whatever your condition is if (...) { var response = actionContext .Request .CreateErrorResponse(HttpStatusCode.BadRequest, "Custom error message"); actionContext.Response = response; } } } 方法也可以覆盖。

答案 1 :(得分:0)

对于自定义错误,请使用IHttpActionResult类型:

[Put]
[Route("api/{userId}")] 
public IHttpActionResult UpdateUser(Guid userId, [FromBody] user)  
{
     if (userId == null) 
     {
       var message = "Sorry, this is not a valid GUID";
       HttpError err = new HttpError(message);
       return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, err));
     }

    . . .
}