Asp.net 在MVC4中为WebApi路由多个GET
我正在ASP.NET MVC4中创建rest API,但在路由方面遇到了问题。作为参考,我已经阅读了这些问题,但它们没有回答我的问题: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
// 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