与这个有关以前的ASP.NET版本的老问题类似,我想获取要绑定到字符串的HTTP POST的请求正文。似乎方法绑定了,但是value当ASP.NET调用我的控制器方法时为null:
value
namespace Demo.Controllers { [Route("[controller]")] public class WebApiDemoController : Controller { ... // POST api/values [HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]string value) { // expected: value = json string, actual: json = null. }
我还需要从溪流中抢走尸体吗?还是应该这样做?在测试上述方法时,我使用了以下http标头:
Accept: Application/json Content-Type: Application/json;charset=UTF-8
我在正文中传递了以下内容: { "a": 1 }
{ "a": 1 }
我不想绑定到名为a的字符串变量。我想绑定我得到的所有JSON,然后我想从我的方法中使用JSON内容,任何随意的内容。
如果我了解文档,则该[FromBody]属性应该已经完成了我想要的工作,但是我猜测ASP.NET核心MVC绑定机制不会将json绑定到“字符串值”,但是也许我可以做一些其他的事情给了我同等的灵活性。
[FromBody]
这里有一个类似的问题使我想到,也许我应该写[FromBody] dynamic data而不是使用[FromBody] string value。
[FromBody] dynamic data
[FromBody] string value
更新:在进行此操作之前,应考虑这种技巧,因为如果您希望.net核心框架为您处理JSON和XML编码,那么您只是扼杀了该功能。某些类型的REST服务器可能并且经常确实需要支持XML和JSON内容类型,至少我遇到的具有标准文档的类型。
以下内容适用于.net core 1.x,但不适用于.net core2.x。
正如我所评论的,解决方案是[FromBody]dynamic data使用dynamic而不是作为参数列表,string我将收到JObject。
[FromBody]dynamic data
dynamic
string
JObject
警告: 如果您的体系结构要求一台WebApi服务器在流产XML和JSON方面同样流利,这取决于内容类型标头条目,则这种直接JSON消费策略会适得其反。(只要有足够的工作就可以在同一服务上同时支持XML和JSON,但是随后您将把MVC资产管道中的内容进一步提升并将其下移到控制器方法中,这与MVC的精神背道而驰。 ,其中已经解析了POCO的模型出现在您的面前。)
一旦在方法内部转换为字符串,JObject就将传入(JSON的内存数据类型为Newtonsoft.JSON)转换为字符串。
在这里找到其他答案。
示例代码,感谢Jeson Martajaya:
具有动态:
[HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]dynamic value) { //... }
使用JObject的示例代码:
[HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]Newtonsoft.Json.Linq.JObject value) { //... }