2013-03-25 39 views
3

我正在构建一个具有多个具有相同签名的get/post调用的web api。现在我知道在多个相同呼叫的情况下,您通常有2个选项:分开到不同的控制器中,或者在您的路由中使用{action}。我已经采取了{动作}方法,因为它最适合我的大部分控制器。但是,在我的一个控制器中,我宁愿不使用操作方法。Web Api多重获取相同的签名路由

我有打电话像这样:

[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 

另外,如果我必须去行动路线,我现在已经有了我使用的其他控制器的路由的方式,但它只是使用(编号)作为其唯一的参数。一个新的路线会与这个路线冲突吗?有没有更好的方法来设置我的路线?

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个参数

回答

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+" } 
     ); 

重要的是, VenuesAllOrStream是第一个,否则VenueOrVideo会选择路线。我很可能会在稍后将操作约束提取到枚举中。

简要说明:设置动作默认值允许路线基本上使其成为可选参数。所以每条路线都没有设置{动作}。