You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core/MVC如何通过GET请求传递复杂对象到API控制器实现缓存

问题根源

你当前的写法错误原因有两点:

  1. GET 请求不存在请求体,你设置的contentType: "application/json"仅对请求体格式生效,对GET请求完全无效
  2. [FromQuery]的模型绑定逻辑是将URL查询参数的键与目标对象的属性一一匹配,而你的写法是把整个JSON序列化为字符串放到value参数中,.NET不会自动把这个JSON字符串反序列化为ChartQuery对象,因此绑定结果始终为空。

最优解决方案(推荐,缓存友好)

不需要修改现有后端代码,仅调整AJAX请求逻辑,直接传递平铺参数即可,框架会自动完成属性绑定:

$.ajax({
    type: "GET",
    url: "/Chart/" + chartAction,
    dataType: "json",
    data: {
        dateFrom : dateFromValue, 
        dateTo : dateToValue, 
        groupBy : groupByValue, 
        // 其余参数直接追加在这里即可
    },
    success: function (data) {
        // 原有处理逻辑不变
    }
});

此时生成的URL格式为/Chart/ProductStockHistory?dateFrom=xxx&dateTo=xxx&groupBy=xxx,完全符合[FromQuery]的绑定规则,且这种键值对形式的查询参数天然支持HTTP响应缓存。


可选方案(仅当你必须传递JSON字符串时使用)

如果业务场景要求必须把所有参数打包为单个JSON字符串传递,你可以修改后端代码手动完成反序列化:

后端调整:

[HttpGet]
[Route("ProductStockHistory")]
public async Task<ChartResponse> ProductStockHistory([FromQuery] string value)
{
    // 手动反序列化JSON字符串为ChartQuery对象
    var query = System.Text.Json.JsonSerializer.Deserialize<ChartQuery>(value);
    // 后续业务逻辑不变
}

该方案不推荐:JSON字符串转义后会导致URL过长,特殊字符可能出现编码问题,且缓存友好性低于平铺参数方案。


响应缓存配置

要启用响应缓存,只需要在Action上添加[ResponseCache]特性,指定缓存时长和需要区分缓存的查询参数即可:

[HttpGet]
[Route("ProductStockHistory")]
// 缓存时长3600秒,根据dateFrom、dateTo、groupBy三个参数区分不同缓存
[ResponseCache(Duration = 3600, VaryByQueryKeys = new []{"dateFrom", "dateTo", "groupBy"})]
public async Task<ChartResponse> ProductStockHistory([FromQuery] ChartQuery value)
{
    // 业务逻辑处理
}

内容的提问来源于stack exchange,提问作者Jamie Hartnoll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:18:04