一尘不染

ASP.NET Core MVC:如何获取原始JSON绑定到没有类型的字符串?

c#

这个有关以前的ASP.NET版本的老问题类似,我想获取要绑定到字符串的HTTP
POST的请求正文。似乎方法绑定了,但是value当ASP.NET调用我的控制器方法时为null:

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的字符串变量。我想绑定我得到的所有JSON,然后我想从我的方法中使用JSON内容,任何随意的内容。

如果我了解文档,则该[FromBody]属性应该已经完成​​了我想要的工作,但是我猜测ASP.NET核心MVC绑定机制不会将json绑定到“字符串值”,但是也许我可以做一些其他的事情给了我同等的灵活性。

这里有一个类似的问题使我想到,也许我应该写[FromBody] dynamic data而不是使用[FromBody] string value

更新:在进行此操作之前,应考虑这种技巧,因为如果您希望.net核心框架为您处理JSON和XML编码,那么您只是扼杀了该功能。某些类型的REST服务器可能并且经常确实需要支持XML和JSON内容类型,至少我遇到的具有标准文档的类型。


阅读 631

收藏
2020-05-19

共1个答案

一尘不染

以下内容适用于.net core 1.x,但不适用于.net core2.x。

正如我所评论的,解决方案是[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)
{
   //...
}
2020-05-19