没有MediaTypeFormatter可用于读取'广告'在asp.net web api中

时间:2015-05-30 08:29:00

标签: c# asp.net asp.net-web-api2 asp.net-identity

我有一个名为广告的课程:

 public class Advertisement
{
    public string Title { get; set; }
    public string Desc { get; set; }
}

并在我的控制器中:

public class OrderController : ApiController
{
    public UserManager<IdentityUser> UserManager { get; private set; }

    // Post api/Order/Test

    [Route("Test")]
    public IHttpActionResult Test(Advertisement advertisement)
    {
        var currentUser = User.Identity.GetUserId();
        Task<IdentityUser> user = UserManager.FindByIdAsync(currentUser);

      return Ok(User.Identity.GetUserId());
    }

但是当我用Postman测试时,我遇到了这个错误,

 "Message": "The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource.",
"ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'Advertisement' from content with media type 'application/octet-stream'.",
"ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
"StackTrace": "   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"

AnyBody能帮助我吗?

3 个答案:

答案 0 :(得分:31)

WebApiConfig.cs中添加注册内容

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));

答案 1 :(得分:4)

  

&#34; ExceptionMessage&#34;:&#34;没有MediaTypeFormatter可用于读取&#39;广告&#39;来自内容与媒体类型&#39; application / octet-stream&#39;。&#34;,

这意味着您的应用程序无法读取八位字节流内容类型 - 这是请求提供的内容。这是我对Web API的一种挫败感。然而,有一种解决方法。简单的方法是将内容类型修改为&application; / json&#39;或者&#39; application / xml&#39;这很容易阅读。 更难的方法是提供自己的MediaTypeFormatter。

答案 2 :(得分:2)

几个问题:

  1. 而不是将其发布为application/octet-stream,而是使用application/json;charset=UTF-8
  2. public IHttpActionResult Test(Advertisement advertisement)需要[FromBody]

    public IHttpActionResult Test([FromBody]Advertisement advertisement) { ... }

    默认情况下,ApiController需要传入任何内容来表示URL参数,因此您需要{I}来查找要在其中解析的任何数据。

    < / LI>
  3. 您需要使用[FromBody]修饰Post方法,以便它不认为它是MVC版本[System.Web.Http.HttpPost]。确保你完整的东西,因为[System.Web.Mvc.HttpPost]也将默认为MVC版本。将[HttpPost]重命名为Test可能并不是一个坏主意,尽管您可能会将其用于单元测试方法,因此不确定该方法。

  4. 以JSON格式发送您的数据:Post

  5. { Title: "some title", Desc: "some description" }函数中执行advertisement的操作:

    Post()