ASP.NET Web API – 没有“MediaTypeFormatter”可用于读取“Int32”类型的对象

我不完全确定这里发生了什么。 我可能在某个地方弄乱了,但我不知道是什么。

我的API控制器方法如下所示:

public HttpResponseMessage Put(int id) 

我也试过一个字符串也有同样的错误。

有任何想法吗?

谢谢。

编辑:要清楚 – id是路由参数。 请求的主体是JSON。 如果我删除route参数,该方法将正常运行。

请阅读以下博文:

  • 来自POSTed数据的ASP.NET Web API和简单值参数

这描述了使用简单参数的大多数典型问题。 如果不了解有关您的请求的详细信息,则无法确定您遇到的请求。

UPDATE

考虑到路由值,还有一个已知的错误。 如果没有一个内置格式化程序用于POST / PUT / PATCH请求,则路由值参数不会被绑定。 要解决此问题,最好的解决方案是编写ActionFilterAttribute,如下所述:

  • MVC 4 Beta Web Api:使用自定义MediaTypeFormatter时绑定路由值的错误

令人惊讶的是,int和string默认没有MediaTypeFormatter,因此它不知道如何处理这些类型。

它知道如何处理开箱即用的唯一类型是JSON,XML和表单url编码数据。 该引用来自官方asp.net网站, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

在Web API中,媒体类型确定Web API如何序列化和反序列化HTTP消息体。 内置对XML,JSON和表单urlencoded数据的支持,您可以通过编写媒体格式化程序来支持其他媒体类型。

现在你可以’编写自己的MediaTypeFormatter(我提供的链接会告诉你如何),但是由于asp.net web api仍然处于测试阶段,我使用自定义格式化程序对字符串之类的简单类型进行了很多麻烦。 我发现在xml / json中包装你想要PUT的任何值都要容易得多,它会自动反序列化。 有关详细信息,请参阅我的post, 当HTTP-POST有body时,url参数为null

对于您的具体示例,您的PUT主体看起来像,

  6  

然后一定要将http请求的内容类型设置为text / xml(如果选择使用,则设置为application / json)。 它应该很好地序列化到变量中。

您是否将int值放在请求消息的正文中? 如果是这样,格式是什么?

如果内容类型是文本,则Web API将不知道如何处理它,因为Web API不提供文本的媒体格式化程序。 Despertar指出,您可以编写自定义格式化程序。

你也可以这样做:

 public void Put() { var s = Request.Content.ReadAsStringAsync().Result; } 

我发布了一个带有json体的DELETE并收到了这个。 使用参数发布解决了问题。

在旁注…我已经看到它在服务开始需要’HTTPS’时抛出此错误。