如何捕获web api uri参数绑定错误?

时间:2013-09-08 15:31:42

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

我正在使用asp.net web-api并尝试捕获两种情况:

  1. 传递未定义的Uri参数
  2. 传递了Uri参数的无效值
  3. 参数和值绑定成功,但是当名称或值无效时,不会发生异常并传递null。

    更多细节:
    ModelState.IsValid永远是真实的 我已经清除了所有格式化程序 使用GlobalConfiguration.Configuration.Formatters.Clear(); 然后添加我继承的XmlMediaTypeFormatter,它设置XmlSerializer = true
    此外,我正在为复杂类型

    使用模式生成的类(xsd工具)

    这是控制器方法签名:

    public Messages GetMessages(int? startId = null, int? endId = null, DateTime? startDate = null, DateTime? endDate = null, int? messageType = null, string clientId = "", bool isCommentsIncluded = false)
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:2)

创建一个类并装饰您要验证的属性。例如(显然,使用你自己的价值观)

public class ModelViewModel
{
    public int Id { get; set; }
    [Required]
    public int RelationshipId { get; set; }
    [Required]
    public string ModelName { get; set; }
    [Required]
    public string ModelAttribute { get;set; }
}

创建一个过滤器,因此您不必在每个控制器中使用Model.IsValid。

public class ValidationFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid)
            actionContext.Response = actionContext.Request
                 .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
    }
}

最后将以下内容添加到Global.asax

中的Application_Start()中
GlobalConfiguration.Configuration.Filters.Add(new ValidationFilter());

希望这有帮助。

更新

public Messages GetMessages([FromUri] ModelViewModel model)

您的模型类现在将绑定到uri checkout this question

中的值