我喜欢 ASP.NET MVC 5 的请求验证功能。我想保留它。但是,它总是会导致将内部错误 (500) 响应返回给客户端。这不太对;真正的问题是这是一个错误的请求!我想返回一个错误请求 (400) 状态代码,并可能返回一个更好看的错误页面。
虽然我发现了很多关于禁用请求验证或实现您自己的自定义验证逻辑的有用信息,但在我所有的搜索中,我还没有找到一种方法来自定义验证失败后的响应。
我怎么做?可能吗?
编辑:我不是在谈论模型验证,而是在谈论请求验证。
我喜欢 ASP.NET MVC 5 的请求验证功能。我想保留它。但是,它总是会导致将内部错误 (500) 响应返回给客户端。这不太对;真正的问题是这是一个错误的请求!我想返回一个错误请求 (400) 状态代码,并可能返回一个更好看的错误页面。
虽然我发现了很多关于禁用请求验证或实现您自己的自定义验证逻辑的有用信息,但在我所有的搜索中,我还没有找到一种方法来自定义验证失败后的响应。
我怎么做?可能吗?
编辑:我不是在谈论模型验证,而是在谈论请求验证。
在我看来,如果 ASP.NET在内部遇到请求中的任何可疑字符,它确实会返回错误请求 (400) 错误代码。例如,当 ASP.NET 尝试根据请求路径选择控制器/操作时,如果路径包含可疑字符,它将返回 400 错误代码。
因此,当我的代码还没有执行时,ASP.NET 会正确处理它。
内部服务器 (500) 错误代码仅在我的代码遇到可疑字符时发生。例如,当我写...
var queryStringKeys = Request.QueryString.AllKeys.ToArray();
...如果查询字符串包含可疑字符,那里的QueryString
属性会抛出一个。HttpRequestValidationException
不处理该异常会使 ASP.NET 返回 500 错误(就像任何其他未处理的异常一样)。
所以正确的处理方式是使用try/catch语句,在catch块中,自己返回一个Bad Request响应。我想您还可以设置某种过滤器,该过滤器也可以HttpRequestValidationException
为您全局处理。