我有这堂课:
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设置不正确时,通常会发生此问题,但由于请求甚至没有处理,因此似乎不是我的情况。
有什么想法吗?
由于
答案 0 :(得分:14)
在POSTMAN内,您只需将设置更改为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上帝!