ASP.NET Web API 2 发送 Dictionary<int, decimal> 作为 GET URI 请求

ASP.NET Web API 2 send Dictionary<int, decimal> as GET URI request

我在发送 Dictionary<int, decimal> 作为 GET URI 请求时遇到问题。我可以轻松地在 POST 请求正文中发送具有这样值的请求并使其工作:

"test": {
  "2019": 30.0916481889
}

但是,由于我没有创建或修改任何内容,为了清楚起见,我不想使用正确的 HTTP 方法。正如您在上面看到的那样,JsonFormatter 不会绑定 Javascript Array 中的 Dictionary,这就是为什么需要使用对象的原因。

这是我正在使用的方法。我试图省略 [FromUri] 但该值始终为空。还尝试使用 Dictionary<int, int>Dictionary<string, string> 来防止文化差异。

[Route("api/test/dictionary")]
[HttpGet]
public async Task<IHttpActionResult> TestDictionary([FromUri]Dictionary<int, decimal> test){

}

我尝试过的请求,所有组合都已尝试使用和不使用 URL 编码:

https://localhost:4431/api/test/dictionary?test=%7B%222019%22%3A%2230.0916481889%22%7D

https://localhost:4431/api/test/dictionary?test=%22test%22%3A%7B%222019%22%3A%2230.0916481889%22%7D

https://localhost:4431/api/test/dictionary?test="test":{"2019":"30"}

https://localhost:4431/api/test/dictionary?test={"2019":"30"}

https://localhost:4431/api/test/dictionary?test={"2019":30}

https://localhost:4431/api/test/dictionary?test={2019:30}

https://localhost:4431/api/test/dictionary?test=2019:30

https://localhost:4431/api/test/dictionary?test=2019

https://localhost:4431/api/test/dictionary?test=2019&test=30 (Longshot from how arrays are handled )

收到请求时看起来像这样:

如何将字典作为 GET URI 请求发送?即使 RFC2616 删除了 GET 请求的 the message-body SHOULD be ignored when handling the request 这句话,我的经验是它可能会在更大的系统中引起问题。 Caching/Proxies 没有按预期工作,举出一些很容易发生并且通常很难调试的怪癖。

@mjwills 重复为我解决了它:

https://localhost:4431/api/test/dictionary?test[0].key=2019&test=[0].value=30.09164818893