Asp.net 在MVC4中为WebApi路由多个GET

Asp.net 在MVC4中为WebApi路由多个GET,asp.net,asp.net-mvc,rest,routing,Asp.net,Asp.net Mvc,Rest,Routing,我正在ASP.NET MVC4中创建rest API,但在路由方面遇到了问题。作为参考,我已经阅读了这些问题,但它们没有回答我的问题: 我希望创建的URL可以如下所示: GET/account/id(其中id是Guid)-相当于GET/account/?id=x GET/account/first%20 last%20名称(其中名称是 字符串)-相当于GET/account/?name=x GET/pendingregistrations/?page=y(此处省略该操作) POST/p

我正在ASP.NET MVC4中创建rest API,但在路由方面遇到了问题。作为参考,我已经阅读了这些问题,但它们没有回答我的问题:

我希望创建的URL可以如下所示:

  • GET/account/id(其中id是Guid)-相当于GET/account/?id=x
  • GET/account/first%20 last%20名称(其中名称是 字符串)-相当于GET/account/?name=x
  • GET/pendingregistrations/?page=y(此处省略该操作)
  • POST/pendingregistrations/denyregistration?denyId=x(此处指定了操作)
  • 如您所见,在某些情况下,控制器名称后的URL映射到参数(上面#1,2中的id和名称),有时映射到操作名称(上面#4)。此外,它可能根本不存在(#3),在这种情况下,我假设一个默认操作。以下是适用于几乎所有情况的路由:

        // Match for an id next.
        config.Routes.MapHttpRoute(
            name: "WithIdApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { action = "Index" },
            constraints: new
            {
                id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$"
            }
        );
    
        // Match for a name next.
        config.Routes.MapHttpRoute(
            name: "WithNameApi",
            routeTemplate: "api/{controller}/{name}",
            defaults: new { action = "Index" }
        );
    
        // Match for an action last.
        config.Routes.MapHttpRoute(
            name: "WithActionApi",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { action = "Index" }
        );
    
    这段代码适用于除上述示例4之外的所有情况,因为MVC无法区分“name”参数和“action”绑定之间的区别。如果我更改了顺序(即,将操作的匹配放在上面),那么“name”参数示例将永远不会起作用


    有人知道我有什么方法可以做到这一点吗?

    对于其他试图做到这一点的人来说,答案是不可能的。最好的做法是将“名称”搜索移动到它自己的操作中。例如:

    • GET/account/id(其中id是Guid)
    • GET/account/name/first%20last

    我本以为MVC会尝试匹配参数或操作,如果一个或另一个失败,并且其他绑定可用,但遗憾的是,事实并非如此。

    对于其他尝试这样做的人来说,答案是不可能。最好的做法是将“名称”搜索移动到它自己的操作中。例如:

    • GET/account/id(其中id是Guid)
    • GET/account/name/first%20last
    我本以为MVC会尝试匹配参数或操作,如果其中一个失败,并且其他绑定可用,但遗憾的是,事实并非如此