【问题标题】:Error posting JSON to Web API 2 : The request entity's media type 'text/plain' is not supported for this resource将 JSON 发布到 Web API 2 时出错:此资源不支持请求实体的媒体类型“text/plain”
【发布时间】:2014-11-14 03:37:03
【问题描述】:

我有这门课:

public class MyClass
{
    public MyClass() { Secret = "Don't tell me"; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Description { get; set; }
    private string Secret { get; set; }
}

还有这个 WEB API 方法:

        // POST api/fixture
    public HttpResponseMessage Post(MyClass value)
    {
        return new HttpResponseMessage(HttpStatusCode.Created);
    }

我已将 Web API 设置为返回 JSON 而不是 XML,并且我没有对默认配置进行任何其他更改。我正在尝试使用 Firefox 的 RESTClient 扩展来测试此方法。这是我的要求:

POST localhost:XXXX/api/fixture
Content-Type: application/json
Accept: application/json
Content-Length: 60

{
 value : { "Name":"Cosby","Age":"13","Description":"OK" }
}

但是我收到了这个错误:

{"Message":"此资源不支持请求实体的媒体类型 'text/plain'。","ExceptionMessage":"没有 MediaTypeFormatter 可用于从具有媒体的内容中读取类型为 'MyClass' 的对象在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable@ 987654324@1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)\r\n 在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable`1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)"}

编辑:

我不明白,因为似乎甚至没有调用该方法。 如果我调试,我看到构造函数被调用,然后没有调用其他方法。不会引发异常。

我在这个问题上已经有很多时间了。我发现这个问题通常发生在 Content-Type 设置不正确的情况下,但似乎不是我的情况,因为请求甚至没有被处理。

有什么想法吗?

谢谢

【问题讨论】:

  • 您不需要在问题中混淆您的端口号。我们不知道localhost 在哪里。无论如何,您确定您的异常发生在该 POST 消息中吗?该异常听起来像是您发布的内容类型为 text/plain 而不是 application/json

标签: json asp.net-web-api asp.net-web-api2


【解决方案1】:

您在正文中发送 application/json 的内容类型,而不是作为标题。因此,您的 POST 请求默认为 text/plain。 RestClient 扩展有一个单独的地方可以输入 header。

如果您对通过网络发送的内容有任何疑问,请查看浏览器开发者工具中的“网络”选项卡,或使用Fiddler 等工具查看网络流量。

【讨论】:

    【解决方案2】:

    您可能需要在 HTTP 请求 header 中添加以下内容:

    Content-Type: application/json
    

    【讨论】:

      【解决方案3】:

      使用 Postman 测试您的 Web API,将其配置为 header: content-type: application/json 由于这是一个 POST 请求,您必须放入原始 json 数据。

      【讨论】:

        【解决方案4】:

        POSTMAN里面,你只需要把设置改成application/json。参考下图。

        【讨论】:

        • 我总是犯这个错误,你想使用上面这张图片右上角的下拉菜单,如果你收到这个错误,你把下拉菜单设置为文本。
        【解决方案5】:

        当我的控制器在参数中有两个不同的模型时,我遇到了这个问题。 Post 方法使用了 builder.EntitySet 中未指定的模型,我解决此问题的方法是创建单独的读写控制器。这与 CQRS 一致。虽然 API 规范变得更加混乱......感谢上帝的 Swagger!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-16
          • 2018-07-12
          • 1970-01-01
          • 2015-10-10
          • 1970-01-01
          • 2020-09-25
          • 2021-08-05
          相关资源
          最近更新 更多