ASP.NET Web API - 没有"MediaTypeFormatter"可用于读取"Int32"类型的对象

Rob*_*ini 16 c# asp.net asp.net-web-api

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

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

public HttpResponseMessage<string> Put(int id)
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

谢谢.

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

Des*_*tar 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和表单urlencoded数据的支持,您可以通过编写媒体格式化程序来支持其他媒体类型.

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

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

<message>
   <id>6</id>
</message>
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*son 6

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

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

你也可以这样做:

public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)


tpe*_*zek 6

请阅读以下博文:

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

UPDATE

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