C# ASP.NET Web API-编号';MediaTypeFormatter';可用于读取类型为';Int32';

C# ASP.NET Web API-编号';MediaTypeFormatter';可用于读取类型为';Int32';,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我不完全确定这里发生了什么。我可能在什么地方把事情搞砸了,但我不知道是什么 我的API控制器方法如下所示: public HttpResponseMessage<string> Put(int id) public void Put() { var s = Request.Content.ReadAsStringAsync().Result; } 公共httpresponsemessageput(int-id) 我也用同样的错误尝试了一个字符串 有什么想法吗 谢谢 编辑

我不完全确定这里发生了什么。我可能在什么地方把事情搞砸了,但我不知道是什么

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

public HttpResponseMessage<string> Put(int id)
public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}
公共httpresponsemessageput(int-id)
我也用同样的错误尝试了一个字符串

有什么想法吗

谢谢


编辑:要清除-id是路线参数。请求的主体是JSON。如果删除route参数,该方法将正常工作。

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

它只知道如何处理开箱即用的类型是JSON、XML和表单url编码的数据。这句话来自asp.net官方网站

在Web API中,媒体类型决定Web API如何序列化和 反序列化HTTP消息正文。内置了对XML的支持, JSON和formurlencoded数据,您可以支持其他媒体 通过编写媒体格式化程序进行键入

现在,您可以“编写”自己的MediaTypeFormatter(我提供的链接将向您展示如何编写),但由于asp.net web api仍处于测试阶段,我在使用自定义格式化程序处理字符串等简单类型时遇到了很多麻烦。我发现,只需将您想要输入的任何值封装到xml/json中,它就会自动反序列化,这要容易得多。更多信息请参见我的帖子

举个具体的例子,你的身体看起来

<message>
   <id>6</id>
</message>

6.

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

是否将int值放在请求消息的主体中?如果是,格式是什么

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

您也可以这样做:

public HttpResponseMessage<string> Put(int id)
public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}

请阅读以下博文:

这描述了使用简单参数的最典型问题。如果不知道关于您的请求外观的更多细节,就无法确定您点击了哪个请求

更新

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


我发布了一个带有json正文的删除,并收到了这个。使用参数发布解决了问题。

附带说明…我看到它在服务开始要求“HTTPS”时抛出此错误。

您可以发布原始请求(来自Fiddler或FireBug)?您是否删除了任何默认格式化程序?你也可以发布配置代码。你想要哪个配置部分?主体是JSON。我只需要它来处理路由参数。如果我从方法定义中删除route参数,它就会工作。我的问题是route参数本身。上述方法定义中的Int-id。@RobertoBonini我已更新了与路由值相关的另一个已知错误的响应。如果在正文中传递该错误,则会应用该错误-我这里的问题是路由参数本身-在本例中为id。是的,这似乎是asp.net web api beta中的错误。当PUT或POST中有正文时,url参数将为null。目前我能提供的唯一选择是在正文中传递所有内容,但是我知道这可能会损害您的RESTful url结构,这一点很重要。我认为这应该是公认的答案。目前公认的答案解决了这个问题,但没有解决方案。这个答案确实有答案。现在你提到了,我想我也提到了。