编程语言
首页 > 编程语言> > c#-调用ASP.NET Core Web API时“ 400 /输入无效”

c#-调用ASP.NET Core Web API时“ 400 /输入无效”

作者:互联网

我正在使用邮递员测试我的Web API,并在邮递员中返回“ 400错误请求”或“输入无效”.我动作第一行的断点没有被击中.我如何弄清楚幕后发生了什么?

我将显示Postman的屏幕截图,但无法上传图片.这只是一个POST,其中为Body指定了多个字段.这是网址:

http://localhost:52126/api/v1/itinerary

这是动作:

[HttpPost]
[Route("api/v1/itinerary")]
public async Task<ActionResult> AddItineraryAsync([FromBody] Itinerary itinerary)
{
    if (!ModelState.IsValid) // Break point on this line not getting hit!
    {
        return BadRequest(ModelState);
    }

    await Logic.AddItineraryAsync(itinerary);

    return Ok();
}

最初,我没有为此操作指定[FromBody].无论哪种方式都行不通.我可以检查什么,以了解发生了什么事?

澄清(回应克里斯·普拉特):

我正处于编写第一个移动应用程序的初期阶段,作为一个自下而上的家伙,我首先开始使用一些Web API调用.我假设我将JSON从移动应用程序传递到此服务器层.

在此Web API项目中,我没有做任何与防伪令牌有关的事情,因此我认为这些令牌没有作用……除非那是Postman所提供的.

从操作中删除该参数确实会使执行下降到我的断点,因此错误似乎与ASP.NET的绑定尝试有关.

在Postman中进行了一些深入研究之后,我确实看到标题为Content-Type指定了x-www-form-urlencoded.根据您的建议,我将其更改为application / json.但是,这似乎没有什么不同.

更多信息:

在尝试了下面卡尔的建议之后,我获得了更多信息.执行权落到了行动中,我看看邮递员正在传递什么.这里是:

----------------------------179455694862693501539465
Content-Disposition: form-data; name="StartPoint"

Tacoma
----------------------------179455694862693501539465
Content-Disposition: form-data; name="EndPoint"

Portland
----------------------------179455694862693501539465
Content-Disposition: form-data; name="TravelDate"

2018-8-21 07:00:00 AM
----------------------------179455694862693501539465
Content-Disposition: form-data; name="Name"

Test Itinerary
----------------------------179455694862693501539465
Content-Disposition: form-data; name="UserAccountId"

2
----------------------------179455694862693501539465
Content-Disposition: form-data; name="Comment"

Just doin' some testing.
----------------------------179455694862693501539465--

Json反序列化因以下原因而失败:

JsonReaderException: Input string &#x27;----------------------------179455694862693501539465&#x27; is not a valid number.

这些数字是什么,它们来自哪里?

解决方法:

仅当ModelState能够成功反序列化发布正文/绑定时,才会验证ModelState.

您的问题并不明确,但是听起来好像您是以x-www-form-urlencoded的形式发布的.在这种情况下,您不应该具有[FromBody].但是,请记住,这是一种“或”的情况,因此,如果您最终希望通过JSON发布,则应保留该属性,然后从Postman发布JSON.

除此之外,请确保您没有使用防伪令牌验证,或者要与请求一起发布有效令牌.反伪造验证失败将使请求短路并立即返回400.

如果要发布JSON,请确保JSON有效.如果JSON无效,您将立即得到400.

标签:asp-net-core-webapi,postman,c
来源: https://codeday.me/bug/20191025/1925467.html