Asp.net web api Web API-来自URI的JObject

Asp.net web api Web API-来自URI的JObject,asp.net-web-api,json.net,Asp.net Web Api,Json.net,Web API允许我在JObject中捕获POST请求的主体: $.post('/api/Query/DoSomething', { Foo: "one", Bar: 4 }); public string Post(JObject data) { // data is populated } 但是,相同的技术不适用于get请求和URI参数 $.get('/api/Controller', { Foo : "one", Bar : 4

Web API允许我在JObject中捕获POST请求的主体:

    $.post('/api/Query/DoSomething', { Foo: "one", Bar: 4 });

    public string Post(JObject data)
    {
        // data is populated
    }
但是,相同的技术不适用于get请求和URI参数

    $.get('/api/Controller', { Foo : "one", Bar : 4 });

    public string Get([FromUri]JObject data)
    {
        // data is empty

    }

这里有什么解决方法吗?

它不起作用,因为GET请求没有正文,因此没有内容类型。因此,Web API不知道URL中有JSON。您有几个选择:

  • 像传统上在GET请求中那样,将数据作为查询字符串参数传递,并更改方法以单独或在常规类(POCO)中接受这些参数
  • 将GET方法更改为接受字符串而不是JObject,然后使用JSON.Net手动对其进行反序列化,例如
    JObject obj=JObject.Parse(data)
  • 如果您有雄心壮志,您可以实现一个自定义绑定器来实现这一点

  • 我的建议是选择1。传统上,GET方法只是用来查找某些内容,所以实际上您应该只传递id和简单的查询选项。在URL中传递JSON数据是不常见的。URL的长度也可能受到某些浏览器的限制。如果您发现需要传递JSON数据,请改用POST(或PUT)。

    最后只对所有请求使用POST。本来希望能够在语义正确的情况下使用GET for,但是考虑到我们的API是动态生成的,我需要一种使GET参数也是动态的方法(因此JObject)