Web API中如何为带查询字符串的URL设计Attribute Routing?
解决ASP.NET Web API路由匹配失败的问题
嘿,我来帮你搞定这个路由问题!你现在的问题出在错误地把查询参数放到了路由模板里,ASP.NET Web API的属性路由规则可不是这么玩的~
问题根源
你写的[Route("GetInfo?param1={param1:string}¶m2={param2:string}")]是错误的:?及后面的查询参数(query string)不属于URL的路径部分,路由模板只需要匹配URL的路径段(也就是subroute/GetInfo这部分),查询参数会自动和方法的同名参数绑定,根本不需要在路由里声明。
正确的路由配置
只需要把路由模板简化为路径部分就行,查询参数完全不用写进去:
[RoutePrefix("subroute")] public class HomeController : ApiController { // 只定义路径,查询参数自动绑定 [Route("GetInfo")] public object GetInfo(string param1, string param2) { // 你的业务逻辑代码 return new { Param1 = param1, Param2 = param2 }; } }
这样当你访问www.domanname.com/subroute/GetInfo?param1=somestring¶m2=somestring时,Web API会:
- 通过
RoutePrefix("subroute")+Route("GetInfo")匹配到对应的方法 - 自动把URL里的查询参数
param1和param2赋值给方法的同名参数
额外注意事项
如果你的Web API还没启用属性路由,一定要在WebApiConfig.cs里添加启用配置,否则属性路由不会生效:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 必须先启用属性路由 config.MapHttpAttributeRoutes(); // 可选:保留传统的基于约定的路由(按需选择) config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
如果某些参数是可选的,你可以给方法参数设置默认值,比如string param1 = null,这样即使不传该参数也能正常匹配路由。
内容的提问来源于stack exchange,提问作者C Sharper
相关产品推荐
相关产品推荐

