【发布时间】:2018-04-09 15:17:15
【问题描述】:
我的 asp.net core 2.0 应用程序中有以下端点:
[HttpPost("postself")]
public IActionResult post([FromBody]JObject email)
{
try
{
var service = new EmailService();
var emailHtml = service.GenerateEmail(email.ToString(), false);
return Json(new { Email = emailHtml });
}
catch
{
return Json(new { Email = "error" });
}
}
这样调用 API 时:
curl -X POST \
http://myapp/api/v1/emails/postself \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: 85c9bbe7-2112-0746-5f41-8dc01b52ab59'
端点被命中并返回return Jason(new { Email = "error" });,这样就可以了。它返回error,因为JObject 是null,但这仍然是预期的行为。
但是,当这样调用 API 时(使用 JSON 有效负载):
curl -X POST \
http://myapp/api/v1/emails/postself \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: a80c85de-8939-01d8-4a5d-c2108bf1491d' \
-d '{
"body": [
{
"image": {
"url": "mailing_logo_slice.png",
"alt": "This is my logo"
}
}
]
}'
...我的应用返回400 Bad request。
此外,请求在开发中有效,但在生产中仅返回 400。
有什么想法吗?
=========
更新代码:
[HttpPost("postself")]
public IActionResult PostSameDomain([FromBody]string email)
{
try
{
var service = new EmailGenerationService();
var emailHtml = service.GenerateEmailFromJson(email, false);
return Json(new { Email = emailHtml });
}
catch
{
return Json(new { Email = "error" });
}
}
[HttpPost("test")]
public IActionResult PostSameDomain([FromBody]EmailViewModel email)
{
try
{
var service = new EmailGenerationService();
var emailHtml = service.GenerateEmailFromJson(email.Raw, false);
return Json(new { Email = emailHtml });
}
catch
{
return Json(new { Email = "error" });
}
}
【问题讨论】:
-
您是否调试并查看了
ModelState.IsValid+ 它的各种其他属性? -
另外,您可能希望以“正确的方式”做事并使用实际的模型类。参见例如app.quicktype.io 根据您的输入 JSON 生成示例代码。
-
对于您的 CURL 数据属性,-d '{"username":"abc","password":"abc"}' 有效吗?如果您没有得到 400,那么我认为这与请求中当前 JSON 对象的结构有关。
-
确保您的
FromBody参数可以反序列化 stackoverflow.com/a/46196415/804385 也使用 catch (Exception ex) 查看错误详细信息 -ex.Message还要检查生产中的Newtonsoft.Json.dll是否没有遗漏 -
@PeterB 我在开发中检查了 ModelState。一切似乎都很好。关于您以“正确方式”做事的建议,因为每次我无法定义 POCO 时,发布的 json 的格式/模型都会有所不同。我只需要原始字符串或 JObject。我从 JObject 参数切换到纯字符串。在开发中这像以前一样工作,但在生产中仍然返回 400...还有其他想法吗?
标签: c# json asp.net-core .net-core