调用核心 Web API 时"400/The input was not valid" ASP.NET



我正在使用postman测试Web API,并在postman中返回"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]。不管怎样都不行。我可以检查什么来了解发生了什么?

澄清(回应Chris Pratt(:

我正处于编写我的第一个移动应用程序的早期阶段,作为一个自下而上的人,我首先得到了一些Web API调用。我想我将把JSON从移动应用程序传递到这个服务器层。

在这个Web API项目中,我还没有做任何与防伪令牌有关的事情,所以我认为这些都不起作用。。。除非那是邮差的东西。

从操作中删除参数确实允许执行到我的断点,所以错误似乎确实与ASP.NET尝试绑定有关。

在Postman中翻了一番之后,我确实看到标题为ContentType指定了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只有在能够成功反序列化post-body/bind的情况下才会被验证。

你的问题没有具体说明,但听起来你是在以x-www-form-urlencoded的身份发帖。如果是这种情况,您应该而不是具有[FromBody]。但是,请记住,这是一种非此即彼的情况,因此,如果您希望最终通过JSON发布,那么您应该保留该属性并从Postman发布JSON。

除此之外,请确保您没有使用防伪造令牌验证,或者在请求时发布了有效的令牌。防雾验证失败将使请求短路,并立即返回400。

如果您发布的是JSON,请确保您的JSON是有效的。如果JSON无效,您将立即得到一个400。

来自注释的解决方案:

对于1794556948662693501539465,您似乎正在使用PostMan,其application/x-www-form-urlencoded为Content Type
我建议您按照以下步骤操作:
1。使用AddItineraryAsync([FromBody]行程(保留您的api
2.在邮递员处清空你的信头
3。Body选项卡选择带有JSON的原始(application/JSON(
4。输入有效的json字符串,或者只使用{}
5。确保除了application/json之外,没有其他头作为headers选项卡中的Content-Type。
6。发送请求以检查api方法是否会被命中。

我曾像您的[FromBody] Itinerary itinerary一样尝试,但遇到了问题。2.1框架存在问题https://github.com/aspnet/Mvc/issues/7609和https://github.com/aspnet/Mvc/issues/7799.我在2.1中得到了这个:客户端javascript不变:

var payload = JSON.stringify({ "name": document.getElementById('firstname').value, "email": document.getElementById('email').value, "captcha": grecaptcha.getResponse() });
var oReq = new XMLHttpRequest();
oReq.ContentType = "application/json";
oReq.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("update").innerHTML = this.responseText;
}
else document.getElementById("update").innerHTML = "not 4&200! : " + this.responseText;
};
oReq.open('POST', 'api/u');
oReq.send(payload);

控制器具有:

[Route("api/[controller]")]
//  [ApiController] // works either way
public class UController : ControllerBase
{
[HttpPost]
public async Task<string> signUp()
{
String body;
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
body = await reader.ReadToEndAsync();
}
UserSignup user = JsonConvert.DeserializeObject<UserSignup>(body);
return user.email;
}
}

即将上线https://github.com/Hover-Us/

相关内容

最新更新