3

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

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

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

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

4

2 回答 2

1

我忘记了您可以使用 ModelState.IsValid 它将在上下文中解决目标。我只是检查:

if(!ModelState.IsValid) throw
于 2013-01-15T06:01:14.927 回答
0

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

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

于 2013-01-04T20:17:13.793 回答