在MVC4中为WebApi路由多个获取

时间:2013-02-19 19:17:10

标签: asp.net asp.net-mvc rest routing

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

我想要制作的网址如下:

  1. GET / account / id(其中id是Guid) - 相当于GET / account /?id = x
  2. GET / account / first%20last%20name(其中name是a 字符串) - 相当于GET / account /?name = x
  3. GET / pendingregistrations /?page = y(此处省略操作)
  4. POST / pendingregistrations / denyregistration?denyId = x(这里指定了一个动作)
  5. 正如您所看到的,在某些情况下,控制器名称后面的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'参数示例将永远不会起作用。

    有谁知道我能做到这一点的任何方式?

1 个答案:

答案 0 :(得分:1)

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

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

我会假设MVC会尝试匹配参数或操作,如果其中一个或另一个失败并且其他绑定可用,但遗憾的是情况并非如此。