我正在构建一个具有多个具有相同签名的get / post调用的web api。现在我知道,在多个相同的呼叫的情况下,您通常有两个选项:分成不同的控制器,或在您的路由中使用{action}。我已经采用了{action}方法,因为它最适合我的大部分控制器。但是,在我的一个控制器中,我宁愿不使用动作方法。
我有这样的电话:
[HttpGet]
public Program Program(string venue, string eventId)
//api/{controller}/{venue}/{eventId}
现在我需要一个新的电话
[HttpGet]
public Program ProgramStartTime(string venue, string eventId)
//api/{controller}/{venue}/{eventId}
我知道我可以为此添加一个动作名称并打电话即
api/{controller}/{action}/{venue}/{eventId}
但我觉得它打破了预期。有没有办法可以像
那样api/Content/LAA/1/PST
api/Content/LAA/1?PST
此外,如果我必须采取行动路线,我目前已经有一条路线用于其他控制器,但它只使用{id}作为唯一参数。一条新路线会与这条路线发生冲突吗?有没有更好的方法来设置我的路线?
config.Routes.MapHttpRoute(
name: "...",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new {id = RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
name: "...",
routeTemplate: "api/{controller}/{action}/{venue}/{eventId}/{...}/{***}/{###}",
defaults: new {### = RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
name: "...",
routeTemplate: "api/{controller}/{action}/{venue}/{eventId}/{...}",
defaults: new {... = RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
name: "...",
routeTemplate: "api/{controller}/{action}/{venue}",
defaults: new {venue = RouteParameter.Optional}
);
我希望至少有一种方法最多可以有5个参数
答案 0 :(得分:3)
这是我找到的答案,它完全符合我的要求:
config.Routes.MapHttpRoute(
name: "VenuesAllOrStream",
routeTemplate: "api/Racing/{action}",
defaults: new { controller = "Racing", action = "Venues" },
constraints: new { action = "Venues|All|Streaming" }
);
config.Routes.MapHttpRoute(
name: "VenueOrVideo",
routeTemplate: "api/Racing/{venue}/{action}",
defaults: new { controller = "Racing", action = "RaceNumbers" },
constraints: new { action = "RaceNumbers|Video" }
);
config.Routes.MapHttpRoute(
name: "ProgramOrMtp",
routeTemplate: "api/Racing/{venue}/{race}/{action}",
defaults: new { controller = "Racing", action = "Program" },
constraints: new { action = "Program|Mtp", race = @"\d+" }
);
VenuesOllOrStream首先是重要的,否则VenueOrVideo会选择路线。我很可能会稍后将动作约束提取到枚举中。
简要说明:设置操作默认值允许路径基本上使其成为可选参数。因此,每条路线都可以在没有{action}实际设置的情况下工作。