【问题标题】:post json to mvc .net core将 json 发布到 mvc .net 核心
【发布时间】:2018-03-16 21:06:19
【问题描述】:

我启动一个 asp.netcore mvc 项目,控制器接受带有 json 对象作为参数的帖子

然后我使用 Insomnia 休息客户端通过将 json 对象发布到操作来测试此操作

但是我得到了错误的请求错误

当我通过网页发帖时,它工作正常

其他客户端的测试有什么问题

* Preparing request to http://localhost:51840/Books/Create
* Using libcurl/7.51.0-DEV OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.6.1_DEV
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 0 cookies
* Found bundle for host localhost: 0x1df804a67a0 [can pipeline]
* Re-using existing connection! (#6) with host localhost
* Connected to localhost (::1) port 51840 (#6)
> POST /Books/Create HTTP/1.1
> Host: localhost:51840
> User-Agent: insomnia/5.14.9
> Content-Type: application/json
> Accept: */*
> Content-Length: 32
| {
|   "Id" : 5,
|   "Name": "Book 3"
| }
* upload completely sent off: 32 out of 32 bytes
< HTTP/1.1 400 Bad Request
< Server: Kestrel
< X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcbWljcm9cRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxN1xQcm9qZWN0c1xRdWlya3lCb29rTGlzdFxCb29rTGlzdFxCb29rTGlzdFxCb29rc1xDcmVhdGU=?=
< X-Powered-By: ASP.NET
< Date: Fri, 16 Mar 2018 08:03:48 GMT
< Content-Length: 0

* Curl_http_done: called premature == 0
* Connection #6 to host localhost left intact

【问题讨论】:

  • 您是否尝试过将来自浏览器的请求与失败的请求进行比较(例如,使用调试网络代理)?

标签: c# asp.net-core-mvc rest-client


【解决方案1】:

这里确实不足以准确回答你的问题,但你说的一件事让我猜到了一个潜在的问题:

当我通过网页发帖时,它工作正常

通过网页提交的表单通常会被编码为x-www-form-urlencodedmultipart/form-data。 ASP.NET Core 将很乐意接受任一编码,无需额外配置。但是,要接受 JSON,您在操作方法上绑定的参数需要用[FromBody] 装饰:

public IActionResult Foo([FromBody]Bar bar)

不过,一旦您这样做了,该操作将不再接受除 JSON/XML/等之外的任何内容。如果您尝试以x-www-form-urlencodedmultipart/form-data 发帖,将会失败。

所以两件事:

  1. 如果您需要接受 JSON 之类的内容,请将 FromBody 属性添加到您的操作参数中。

  2. 如果您需要同时接受 JSON 之类的内容 常规表单帖子,您需要两种操作方法。是的,你没看错:两个。一个有FromBody,一个没有。在内部,您可以将操作方法​​的实际代码分解为控制器上的私有或受保护方法,然后让两个操作都使用它,这样至少您不必复制代码。

【讨论】:

  • 嗨,克里斯,感谢您的回复。虽然这不起作用......它让我想到了属性......原来这是因为 [ValidateAntiForgeryToken] 属性。在我注释掉之后,它起作用了。谢谢你:)
  • “如果您需要同时接受 JSON 和常规表单帖子之类的内容,则需要两种操作方法”。是的,这些方法必须有不同的名称,否则你会得到错误。所以你的 API 签名改变了,客户端必须更新他们的代码。天哪,另一个在 .NET Framework 中“正常工作”但在 Core 中停止工作的例子。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2018-10-12
  • 2018-08-09
  • 2020-09-07
  • 1970-01-01
相关资源
最近更新 更多