【发布时间】:2014-06-11 09:42:37
【问题描述】:
我从here 看到了model validation(下部分:Handling Validation Errors)。
code-sn-p 如下Web API
public class ValidateModel : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
base.OnActionExecuting(actionContext);
}
}
问题是upon validation of model,如果有任何错误,it assigns an model state invalid异常。
然后,在进入实际方法(用这个[ValidateModel] 属性修饰)之前,WebAPI 只返回一个 400 请求。
但是怎么做呢?哪个函数返回HTTP 400?
这个方法执行完成后会发生什么?控制流向哪里?
编辑:
我应用这个属性的动作是正常的。
[ValidateModel]
public IHttpActionResult Post([FromBody]Request)
{
//do normal business logics here.
return Ok(SuccessMessage);
}
【问题讨论】:
-
可能与名为
CreateErrorResponse的方法有关。听起来可能会产生错误响应 -
1) 使用 try..catch 并捕获错误,正如 Daveparsons 所说,它可能是 CreateErrorResponse 函数。 2) 是否有为此触发的过滤器?
-
@Zakos:不,它根本不会抛出任何错误。我删除了
actionContext.Response,以便调用CreateErrorResponse。但它返回一个200 -
@DaveParsons:
trycatch没有捕捉到异常。控制只是顺流而下。 -
这就是 Web Api 的工作原理。这就是 Web Api 的设计和架构。当您将值设置为 actionContext.Response 时,在此示例中您将其设置为 BadRequest ,即 400,这是服务器的答案。 200 是服务器的 OK 回答。并且当 actionContext.Response 被设置时,它不会向前移动到控制器,请求就完成了!现在,当您说“抛出”时,我们会自动处理错误、异常,但情况并非如此。所以请注意。这里没有错误/异常。您的代码说:如果模型无效 - 回答 400 ,否则继续。
标签: c# asp.net .net asp.net-web-api asp.net-web-api2