Web API 2同参数GET方法属性路由使用及接口调用异常问题
解决Web API 2属性路由匹配错误的问题
我来帮你捋清楚这个路由匹配的问题,以及对应的解决办法:
问题核心原因
Web API 2的路由匹配是有优先级和规则的:
- 没有标记
[Route]特性的方法会沿用默认路由模板(通常是api/{controller}/{id})进行匹配 - 你的第二个方法虽然加了属性路由,但它要求参数是路径参数(即参数要嵌在URL路径里),而你调用时用的是查询字符串传参(
?applicationRequisitionOid=xxx),这就导致请求没有命中第二个方法的属性路由,反而被默认路由匹配到了第一个Get方法——因为默认路由支持通过查询字符串绑定参数,Web API会自动把查询串里的applicationRequisitionOid绑定到第一个Get方法的参数上,所以才会总是调用第一个接口。
几种可行的解决方案
方案1:修改调用方式,使用路径参数
按照第二个方法属性路由的要求,把参数放到URL路径里,修改你的调用代码:
HttpResponseMessage response = _HttpClient.GetAsync($"api/ApplicationSIRMeasure/RequisitionNameByQuantity/{aa}").Result;
这样请求会精准匹配到第二个方法的属性路由,不会再触发第一个Get方法。
方案2:调整第二个方法的路由,支持查询字符串传参
如果你想保留查询字符串的传参习惯,可以修改第二个方法的路由特性,让它适配查询参数:
[Route("api/ApplicationSIRMeasure/RequisitionNameByQuantity")] public HttpResponseMessage RequisitionNameByQuantity([FromUri] Guid applicationRequisitionOid) { // 原有方法逻辑不变 }
[FromUri]明确指定从查询字符串获取参数,同时路由模板去掉路径参数的要求,这样你原来的调用代码就能正常命中这个方法了。
方案3:给第一个方法也添加明确的属性路由,彻底避免混淆
为了从根源上消除路由歧义,你可以给第一个Get方法也加上专属的属性路由:
[Route("api/ApplicationSIRMeasure/Get/{applicationRequisitionOid:Guid}")] public HttpResponseMessage Get(Guid applicationRequisitionOid) { // 原有方法逻辑不变 }
这样两个方法都有清晰的专属路由,不会再出现匹配错误的情况,各自的调用URL也一目了然。
额外提醒
别忘了确认你的Web API项目已经启用了属性路由:在WebApiConfig.cs里必须有config.MapHttpAttributeRoutes();这行代码,而且要放在默认路由注册代码的前面,这样属性路由才能优先生效。
内容的提问来源于stack exchange,提问作者Salim Latif Waigaonkar
相关产品推荐
相关产品推荐

