web-dev-qa-db-ja.com

asp.net web apiの「Advertisement」タイプのオブジェクトを読み取るためのMediaTypeFormatterは使用できません。

名前がAdvertisementであるクラスがあります:

 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は私を助けてくれますか?

17
Mehran Ahmadi

あなたのWebApiConfig.csレジスタ内にこれを追加

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

"ExceptionMessage": "メディアタイプが 'application/octet-stream'のコンテンツからタイプ 'Advertisement'のオブジェクトを読み取るためのMediaTypeFormatterがありません。"、

これは、アプリケーションがオクテットストリームのContent-Typeを読み取れないことを意味します。これは、リクエストが提供したものです。これは、Web APIに対する不満の1つです。しかし、それを回避する方法があります。簡単な方法は、Content-typeを「application/json」または「application/xml」に変更して、簡単に読み取れるようにすることです。より難しい方法は、独自のMediaTypeFormatterを提供することです。

4
Dave Agaba

いくつかの問題:

  1. _application/octet-stream_として投稿する代わりに、代わりに_application/json;charset=UTF-8_を使用します。
  2. public IHttpActionResult Test(Advertisement advertisement)には_[FromBody]_が必要です:

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

    デフォルトでは、ApiControllerはURLパラメーターを表すために渡されるものを想定しているため、解析するリクエストボディに投稿するデータには_[FromBody]_が必要です。

  3. Postメソッドを_[System.Web.Http.HttpPost]_で修飾して、MVCバージョン_[System.Web.Mvc.HttpPost]_とは思わないようにする必要があります。 _[HttpPost]_もデフォルトでMVCバージョンになるため、必ずすべてを入力してください。おそらくTestPostに名前変更することも悪い考えではありませんが、それを単体テストメソッドに使用している可能性があります。

  4. データをJSONとして送信:_{ Title: "some title", Desc: "some description" }_

  5. Post()関数内でadvertisementを使用して何かを実行します。

    _string title = advertisement.Title; string desc = advertisement.Desc;_

2
vapcguy