我有一个.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...
对于PlayerPackage
,请求应发送一个PlayerPackage Json对象,根据您的描述,您无法控制从其他地方发布的请求。
对于请求,其类型为 application / x-www-form-urlencoded,它将以字符串格式而不是Json对象发送带有{“ status”:“ incomplete”,“ score”:“”}}的数据。如果您想接受{“ status”:“ incomplete”,“ score”:“”},建议您更改如下方法,然后将字符串转换为ObjectNewtonsoft.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);
}
我已经遵循了,但是从邮递员发送时,我的“数据”为空。知道为什么吗?
@ r3plica,我将使用自定义类型而不是字符串。将数据放入类型本身,然后在[FromForm]旁边,放置[FromForm] CustomType请求,然后在该自定义类型中,访问数据属性(或属于表单编码请求的其他属性)。这就是我所做的事情,并且有效。
@firecape我遇到了完全相同的问题,数据为null,前一个值为字符串。