如何让Web API拒绝具有无效负载的请求?

时间:2013-01-04 18:18:12

标签: .net asp.net-mvc-4 asp.net-web-api

我在web api中使用了一些版本控制技术,这些技术基本上会根据标头中指定的api版本调用控制器。所以情节,假设我们有一个名为api / GetSalesHistory的入口点,但是我们的服务器人员(我)必须更改请求合同才能让我们做我们需要做的事情。在某些情况下,这会成为一个重大变化(例如新的必填字段,或已更改为列表的单个值),因此会进行版本控制。

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

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

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

2 个答案:

答案 0 :(得分:1)

我忘记了你可以使用ModelState.IsValid,它会在上下文中解决目标。我只是查一下:

if(!ModelState.IsValid) throw

答案 1 :(得分:0)

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

http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx