Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获web api uri参数绑定错误?_C#_Asp.net Web Api - Fatal编程技术网

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

C# 如何捕获web api uri参数绑定错误?,c#,asp.net-web-api,C#,Asp.net Web Api,我正在使用asp.net web api并尝试捕捉两种情况: 传递了一个未定义的Uri参数 传递了Uri参数的无效值 参数和值绑定成功,但当名称或值无效时,不会发生异常并传递null 更多详细信息: ModelState.IsValid始终为真 我已清除所有格式化程序 使用GlobalConfiguration.Configuration.Formatters.Clear() 然后添加继承的XmlMediaTypeFormatter,它设置XmlSerializer=true 此外,我还为复杂类

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

  • 传递了一个未定义的Uri参数
  • 传递了Uri参数的无效值
  • 参数和值绑定成功,但当名称或值无效时,不会发生异常并传递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)
    

    有什么想法吗?

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

    创建一个过滤器,这样就不必在每个控制器中都使用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中的应用程序_Start()

    GlobalConfiguration.Configuration.Filters.Add(new ValidationFilter());
    
    希望这有帮助

    更新
    您的模型类现在将绑定到uri签出中的值

    谢谢,但我不确定我是否理解您的解决方案如何将其用于传递uri的简单类型,请使用此单一类而不是简单类型?我不知道代码中发生了什么变化,但我现在正在正确更新ModelState.IsValid。正如您所建议的,了解另一种方法很好,但它不适用于检测任何拼写错误的参数
    GlobalConfiguration.Configuration.Filters.Add(new ValidationFilter());
    
    public Messages GetMessages([FromUri] ModelViewModel model)