.NET Core/MVC如何通过GET请求传递复杂对象到API控制器实现缓存
问题根源
你当前的写法错误原因有两点:
- GET 请求不存在请求体,你设置的
contentType: "application/json"仅对请求体格式生效,对GET请求完全无效 [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
相关产品推荐
相关产品推荐

