ASP.NET Web API GET请求查询参数被忽略使用默认值的原因是什么
问题原因
- 你的Action方法上的
Route特性声明了{startTime}/{endTime}路径参数模板,这会让ASP.NET Core路由系统默认将这两个参数的绑定源设为路径路由数据,不会主动去查询字符串中匹配同名参数。 - 你为路径参数配置了默认值,所以当你发送不带路径参数、仅带查询参数的请求时,路由仍然可以匹配成功,但路径中没有对应参数值,方法就直接使用预设的默认值,完全忽略了查询字符串的传入参数。
修复方案
方案1:仅支持查询参数形式(适配你需求的目标接口)
直接删除Action上Route特性的路径参数模板即可,简单类型参数在GET请求下默认会从查询字符串绑定:
[ApiController] [Route("/api/sessions/byhour")] public class LoginStatsByHourController : ControllerBase { [HttpGet] public List<SessionEntry> GetSessionEntryByDate(string startTime, string endTime) {...} }
修改后即可正常响应{apiUrl}/api/sessions/byhour?startTime=xxx&endTime=xxx形式的请求。
方案2:同时支持路径参数+查询参数两种传参方式
如果需要兼容两种传参格式,可以配置多路由模板,同时为参数指定多个绑定源:
[ApiController] [Route("/api/sessions/byhour")] public class LoginStatsByHourController : ControllerBase { [HttpGet] [Route("")] // 匹配查询参数请求 [Route("{startTime=0001-01-01T12:00:00}/{endTime=9999-12-31T11:59:59}")] // 匹配路径参数请求 public List<SessionEntry> GetSessionEntryByDate([FromRoute][FromQuery] string startTime, [FromRoute][FromQuery] string endTime) {...} }
这种配置下,会优先取路径参数的值,路径无对应参数时自动读取查询参数的值。
内容的提问来源于stack exchange,提问作者Oleksandr Novik
相关产品推荐
相关产品推荐

