名前が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は私を助けてくれますか?
あなたのWebApiConfig.cs
レジスタ内にこれを追加
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
"ExceptionMessage": "メディアタイプが 'application/octet-stream'のコンテンツからタイプ 'Advertisement'のオブジェクトを読み取るためのMediaTypeFormatterがありません。"、
これは、アプリケーションがオクテットストリームのContent-Typeを読み取れないことを意味します。これは、リクエストが提供したものです。これは、Web APIに対する不満の1つです。しかし、それを回避する方法があります。簡単な方法は、Content-typeを「application/json」または「application/xml」に変更して、簡単に読み取れるようにすることです。より難しい方法は、独自のMediaTypeFormatterを提供することです。
いくつかの問題:
application/octet-stream
_として投稿する代わりに、代わりに_application/json;charset=UTF-8
_を使用します。public IHttpActionResult Test(Advertisement advertisement)
には_[FromBody]
_が必要です:
public IHttpActionResult Test([FromBody]Advertisement advertisement) { ... }
デフォルトでは、ApiControllerはURLパラメーターを表すために渡されるものを想定しているため、解析するリクエストボディに投稿するデータには_[FromBody]
_が必要です。
Postメソッドを_[System.Web.Http.HttpPost]
_で修飾して、MVCバージョン_[System.Web.Mvc.HttpPost]
_とは思わないようにする必要があります。 _[HttpPost]
_もデフォルトでMVCバージョンになるため、必ずすべてを入力してください。おそらくTest
をPost
に名前変更することも悪い考えではありませんが、それを単体テストメソッドに使用している可能性があります。
データをJSONとして送信:_{ Title: "some title", Desc: "some description" }
_
Post()
関数内でadvertisement
を使用して何かを実行します。
_string title = advertisement.Title; string desc = advertisement.Desc;
_