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

时间:2018-03-01 01:06:08

标签: asp.net-core-2.0 asp.net-core-webapi

我有一个.Net Core Web API,当我尝试向其发布一些包含一些json的数据时,它返回415不支持的媒体错误。以下是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...

4 个答案:

答案 0 :(得分:14)

对于PlayerPackage,请求应发送 PlayerPackage Json对象,根据您的描述,您无法控制从其他位置发布的请求。

对于请求,其类型为 application / x-www-form-urlencoded ,它将发送 {“status”:“不完整”,“得分”:“”的数据字符串格式而不是Json对象。。如果您想接受 {“status”:“不完整”,“得分”:“”} ,我建议您更改下面的方法,然后通过{{1}将字符串转换为Object }

Newtonsoft.Json

答案 1 :(得分:12)

尝试使用 [FromForm] 代替 [FromBody]

public IActionResult Post([FromForm] PlayerPackage playerPackage)

FromBody - &gt;如果你从JSON绑定

FromForm - &gt;如果您从表单参数绑定

注1:

您也可以完全删除[FromBody]并进行试用。因为你期望form-urlencoded应该告诉它绑定到object。

答案 2 :(得分:3)

这对我有用:

[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromForm]IFormCollection value)

希望有帮助

答案 3 :(得分:0)

我有同样的问题。 FormDataCollection没有格式化程序所需的默认构造函数。改用IFormCollection