Jsonを含むデータを投稿しようとすると415 Unsupported Media Errorを返す.Net Core Web APIがあります。 Chromeデバッガーで返されるものの一部を次に示します。
Request URL:http://localhost:51608/api/trackAllInOne/set
Request Method:POST
Status Code:415 Unsupported Media Type
Accept:text/javascript, text/html, application/xml, text/xml, */*
Content-Type:application/x-www-form-urlencoded
action:finish
currentSco:CSharp-SSLA:__How_It_Works_SCO
data:{"status":"incomplete","score":""}
activityId:13
studentId:1
timestamp:1519864867900
これは、コントローラーがapplication/x-www-form-urlencoded
data-しかし、私にはわかりません。コントローラーをConsumes
で装飾しようとしましたが、うまくいかないようです。
[HttpPost]
[Route("api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromBody] PlayerPackage playerPackage)
{ etc..}
どんな助けも大歓迎です。
次のコードは.Net 4.6.1で正常に機能し、上記の投稿をキャプチャして処理できます。
[ResponseType(typeof(PlayerPackage))]
public async Task<IHttpActionResult> PostLearningRecord(PlayerPackage playerPackage)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var id = Convert.ToInt32(playerPackage.ActivityId);
var learningRecord = await _context.LearningRecords.FindAsync(id);
if (learningRecord == null)
return NotFound();
etc...
PlayerPackage
の場合、リクエストはPlayerPackage Json Objectを送信する必要があります。説明に基づいて、投稿されたリクエストを制御できませんでした別の場所。
リクエストの場合、そのタイプはapplication/x-www-form-urlencodedで、{ "status": "incomplete"、 "score": ""}Jsonオブジェクトの代わりに文字列形式で。 {"status": "incomplete"、 "score": ""}を受け入れたい場合は、以下のようにメソッドを変更することをお勧めします。次に、Newtonsoft.Json
によって文字列をObjectに変換します
[HttpPost]
[Route("~/api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm] string data)
{
PlayerPackage playerPackage = JsonConvert.DeserializeObject<PlayerPackage>(data);
return Json(data);
}
[FromBody]の代わりに[FromForm]を使用してみてください
public IActionResult Post([FromForm] PlayerPackage playerPackage)
FromBody-> JSONからバインドする場合
FromForm-> Formパラメーターからバインドする場合
注1:
[FromBody]を完全に削除して、試用することもできます。 form-urlencodedはオブジェクトにバインドするように指示する必要があるためです。
同じ問題がありました。 FormDataCollectionには、フォーマッターが必要とするデフォルトのコンストラクターがありません。代わりにIFormCollectionを使用してください