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

Web API中如何为带查询字符串的URL设计Attribute Routing?

解决ASP.NET Web API路由匹配失败的问题

嘿,我来帮你搞定这个路由问题!你现在的问题出在错误地把查询参数放到了路由模板里,ASP.NET Web API的属性路由规则可不是这么玩的~

问题根源

你写的[Route("GetInfo?param1={param1:string}&param2={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&param2=somestring时,Web API会:

  1. 通过RoutePrefix("subroute") + Route("GetInfo")匹配到对应的方法
  2. 自动把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:35:08