我想从我的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的默认行为?
答案 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));
}
. . .
}