C# 将json发布到mvc.net核心

C# 将json发布到mvc.net核心,c#,asp.net-core-mvc,rest-client,C#,Asp.net Core Mvc,Rest Client,我启动了一个asp.netcore mvc项目,其中一个控制器接受post,并将json对象作为参数 然后,我使用rest客户端通过将json对象发布到该操作来测试该操作 然而,我得到了错误的请求 当我通过网页发帖子时,效果很好 rest客户端的测试有什么问题 * Preparing request to http://localhost:51840/Books/Create * Using libcurl/7.51.0-DEV OpenSSL/1.0.2j zlib/1.2.8 libssh2

我启动了一个asp.netcore mvc项目,其中一个控制器接受post,并将json对象作为参数

然后,我使用rest客户端通过将json对象发布到该操作来测试该操作

然而,我得到了错误的请求

当我通过网页发帖子时,效果很好

rest客户端的测试有什么问题

* 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

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

当我通过网页发帖子时,效果很好

通过网页提交的表单通常被编码为x-www-form-urlencoded或多部分/表单数据。ASP.NET内核将乐于接受任何一种编码,无需额外配置。但是,要接受JSON,操作方法上绑定到的参数需要用[FromBody]修饰:

但是,一旦您这样做,该操作将不再接受JSON/XML/等以外的任何内容。如果您尝试以x-www-form-urlencoded或multipart/form数据的形式发布,它将失败

所以有两件事:

如果需要接受类似JSON的内容,请将FromBody属性添加到动作参数中

如果需要同时接受JSON和常规表单post,则需要两种操作方法。是的,你读对了:两个。一个有FromBody,一个没有。在内部,您可以将操作方法的实际代码分解为控制器上的私有或受保护方法,然后让两个操作都使用该方法,这样至少您不必重复代码


您是否尝试过比较,例如,使用调试web代理将来自浏览器的请求与失败的请求进行比较?嗨,Chris,谢谢您的回复。虽然那没用。。。这让我想到了这些属性。。。原来是因为[ValidateAntiForgeryToken]属性。在我把它评论出来之后,它就起作用了。谢谢您:
public IActionResult Foo([FromBody]Bar bar)