【问题标题】:ASP.NET Web API - No 'MediaTypeFormatter' is available to read an object of type 'Int32'ASP.NET Web API - 没有“MediaTypeFormatter”可用于读取“Int32”类型的对象
【发布时间】:2012-04-02 15:24:53
【问题描述】:

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

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

public HttpResponseMessage<string> Put(int id)

我也尝试了一个字符串,但出现了同样的错误。

有什么想法吗?

谢谢。

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

【问题讨论】:

  • 你能发布原始请求(来自 Fiddler 或 FireBug)吗?
  • 您是否删除了任何默认格式化程序?能不能把配置代码也贴一下。
  • 你想要哪些配置部分?

标签: c# asp.net asp.net-web-api


【解决方案1】:

令人惊讶的是,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 仍处于测试阶段,我在使用简单类型的自定义格式化程序时遇到了很多麻烦像字符串。我发现只需将您想要 PUT 的任何值包装在 xml / json 中就容易得多,它会自动反序列化。有关更多信息,请参阅我的帖子,When HTTP-POST has body, url parameter is null

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

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

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

【讨论】:

  • 如果它在正文中传递,这将适用 - 我的问题在于路由参数本身 - 在本例中为 id。
  • 是的,这似乎是 asp.net web api beta 中的一个错误。当您在 PUT 或 POST 中有正文时,url 参数将为空。我暂时可以提供的唯一选择是传递正文中的所有内容,但是我知道这可能会损害您的 RESTful url 结构,这很重要。
  • 我认为这应该是公认的答案。当前接受的答案解决了该问题,但没有解决方案。这个答案确实有解决方案。
【解决方案2】:

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

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

你也可以这样做:

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

【讨论】:

  • 正文是 JSON。我只需要它与路由参数一起工作。如果我从方法定义中删除路由参数,它可以工作。
【解决方案3】:

请阅读以下博文:

这描述了使用简单参数的最典型问题。如果不了解有关您的请求外观的更多详细信息,则无法确定您点击了哪一个。

更新

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

【讨论】:

  • 我的问题特别是路由参数本身。上面方法定义中的 int id。
  • @RobertoBonini 我已经更新了针对路由值的另一个已知错误的响应。
【解决方案4】:

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

【讨论】:

  • 有趣。现在你提到它,我想我也有。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2018-05-29
    • 2012-09-12
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多