Asp.net-Core-2.0

在 Web API .NET Core 中接受 x-www-form-urlencoded

  • March 1, 2018

我有一個 .NET Core Web API,當我嘗試向它發布一些包含一些 json 的數據時,它返回 415 Unsupported Media Error。以下是 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數據有關——但我不確定。我試過用它來裝飾我的控制器,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”:""}**,我建議您更改如下方法,然後將字元串轉換為 Object byNewtonsoft.Json

[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);
}

嘗試使用[FromForm]而不是[FromBody].

public IActionResult Post([FromForm] PlayerPackage playerPackage)
  • FromBody> 從 JSON 綁定
  • FromForm> 從表單參數綁定

您也可以[FromBody]完全刪除並試用它。因為您期望 form-urlencoded 應該告訴它綁定到對象。

引用自:https://stackoverflow.com/questions/49041127