.net 如何让WebAPI拒绝具有无效负载的请求?

.net 如何让WebAPI拒绝具有无效负载的请求?,.net,asp.net-mvc-4,asp.net-web-api,.net,Asp.net Mvc 4,Asp.net Web Api,我在WebAPI中使用了一些版本控制技术,这些技术基本上会根据标头中指定的api版本调用控制器。因此,假设我们有一个名为api/GetSalesHistory的入口点,但是我们的服务器人员(我)必须更改请求契约,以便我们完成我们需要做的事情。在某些情况下,这将成为一个突破性的更改(例如一个新的必填字段,或一个已更改为列表的单个值),从而导致版本控制 因此,我的路由选择器将在标头中查找api版本,然后调用正确的控制器。版本1控制器的参数类型为版本1请求,版本2控制器的参数类型为版本2请求 问题出在

我在WebAPI中使用了一些版本控制技术,这些技术基本上会根据标头中指定的api版本调用控制器。因此,假设我们有一个名为api/GetSalesHistory的入口点,但是我们的服务器人员(我)必须更改请求契约,以便我们完成我们需要做的事情。在某些情况下,这将成为一个突破性的更改(例如一个新的必填字段,或一个已更改为列表的单个值),从而导致版本控制

因此,我的路由选择器将在标头中查找api版本,然后调用正确的控制器。版本1控制器的参数类型为版本1请求,版本2控制器的参数类型为版本2请求

问题出在这里。开箱即用,无论您发送的有效负载如何,控制器都将运行。回到WCF,如果您发送了错误的对象,序列化将失败,导致整个请求失败。现在,如果我将版本1有效负载发送到版本2控制器,而不是序列化失败或请求失败,它将创建一个带有空字段的版本2请求实例,然后继续运行。所以参数不是以null的形式出现的,所以我不能简单地说(request==null)是否爆炸


如果未收到预期的有效负载,如何强制控制器拒绝请求?

任何反序列化异常都会记录在ModelState中,以便您以任何方式处理它们。因此,您应该能够检查无效的ModelState并适当地处理它。这篇博文可能会给你一些想法:


我忘记了可以使用ModelState.IsValid,它将在上下文中处理目标。我只是简单地检查一下:

if(!ModelState.IsValid) throw