我不完全确定这里发生了什么。我可能在某处弄乱了,但我不知道是什么。
我的API控制器方法如下所示:
public HttpResponseMessage<string> Put(int id)
我也尝试了一个字符串也有同样的错误。
有什么想法吗?
感谢。
编辑:要清除 - id是路由参数。请求的主体是JSON。如果我删除route参数,该方法将正常运行。
答案 0 :(得分:13)
令人惊讶的是,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和form-urlencoded数据,您可以支持其他媒体 通过编写媒体格式化程序来填写类型。
现在你可以'编写自己的MediaTypeFormatter(我提供的链接会告诉你如何),但是由于asp.net web api仍然处于测试阶段,因此使用自定义格式化程序来处理简单类型时遇到了很多麻烦像字符串。我发现在xml / json中包装你想要PUT的任何值都要容易得多,它会自动反序列化。有关详细信息,请参阅我的帖子,When HTTP-POST has body, url parameter is null
对于您的具体示例,您的PUT主体看起来像,
<message>
<id>6</id>
</message>
然后确保将http请求的内容类型设置为text / xml(如果选择使用,则设置为application / json)。它应该很好地序列化到变量中。
答案 1 :(得分:6)
请阅读以下博文:
这描述了使用简单参数的大多数典型问题。如果不了解有关您的请求的详细信息,则无法确定您遇到的是哪一个。
<强>更新强>
还有一个已知的错误考虑了路由值。如果没有一个内置格式化程序用于POST / PUT / PATCH请求,则路由值参数不会被绑定。要解决此问题,最好的解决方案是编写ActionFilterAttribute,如下所述:
答案 2 :(得分:5)
您是否将int值放在请求消息的正文中?如果是这样,格式是什么?
如果内容类型是文本,则Web API将不知道如何处理它,因为Web API不提供文本的媒体格式化程序。正如Despertar所说,您可以编写自定义格式化程序。
您也可以这样做:
public void Put()
{
var s = Request.Content.ReadAsStringAsync().Result;
}
答案 3 :(得分:0)
我发布了一个带有json主体的DELETE并收到了这个。使用参数发布解决了问题。
答案 4 :(得分:0)
旁注...当服务开始要求'HTTPS'时,我已经看到它抛出此错误。