将JSON发布到Web API 2时出错:此资源不支持请求实体的媒体类型“text / plain”

时间:2014-09-19 13:54:58

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

我有这堂课:

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'类型的对象输入'text / plain'。“,”ExceptionType“:”System.Net.Http.UnsupportedMediaTypeException“,”StackTrace“:”at System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent content,Type type,IEnumerable { {1}} 1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)\ r \ n在System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage请求,类型类型,IEnumerable`1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)“} < / p>

编辑:

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

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

有什么想法吗?

由于

5 个答案:

答案 0 :(得分:14)

POSTMAN内,您只需将设置更改为application / json即可。请参阅下面的图片。

application/json

答案 1 :(得分:9)

您在正文中发送了application/json的内容类型,而不是标题。所以你的POST请求默认为text / plain。 RestClient扩展名有一个单独的位置来输入标题。

如果您对通过网络发送的内容有疑问,请查看浏览器开发人员工具中的“网络”标签,或使用Fiddler等工具查看网络流量。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

Content-Type: application/json

答案 4 :(得分:0)

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