2013-03-25 60 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會選擇路線。我很可能會在稍後將操作約束提取到枚舉中。

簡要說明:設置動作默認值允許路線基本上使其成爲可選參數。所以每條路線都沒有設置{動作}。