-1

如何定義一組允許我處理這兩種類型的URI請求的路由(或修改我的控制器)?請注意,我可以修改我的類和路由,但我無法更改URI的結構。如何處理這種類型的Web API 2路由方案?

實施例1個URI 路由正確地WidgetsController

API /部件/ {微件ID}

實施例2條URI 路線錯誤地WidgetsController。我想讓它路由到WidgetActionController

API /部件/ {控件ID}/widgetaction/{窗口小部件操作ID}

這裏是我的控制器

Public Class WidgetsController 

    Inherits ApiController 

    ' GET api/widgets/{widget id} 
    Public Function [Get](id as integer) As Widget 
     Return DataAccess.GetWidgetByID(id) 
    End Function 

End Class 

Public Class WidgetActionController 

    Inherits ApiController 

    ' GET api/widgets/{widget id}/widgetaction/{action} 
    Public Function [Get](id as integer, action as integer) As Boolean 
     'Get Widget By ID 
     'Perform {action} on Widget  
    End Function 

End Class 

這裏是我的路線:

config.Routes.MapHttpRoute("Data", 
       "api/{controller}/{id}/{year}/{month}/{day}", 
       New With {Key .id = RouteParameter.[Optional], 
       .year = RouteParameter.[Optional], 
       .month = RouteParameter.[Optional], 
       .day = RouteParameter.[Optional]}) 

config.Routes.MapHttpRoute("WidgetAction", 
          "api/widgets/{id}/widgetaction/{action}", 
          New With {Key .controller = "WidgetAction"}) 

回答

1

路由是爲了具體。在這種情況下你需要做的唯一事情就是在通用路由之前放置更具體的路由。

config.Routes.MapHttpRoute("WidgetAction", 
         "api/widgets/{id}/widgetaction/{action}", 
         New With {Key .controller = "WidgetAction"}) 

config.Routes.MapHttpRoute("Data", 
      "api/{controller}/{id}/{year}/{month}/{day}", 
      New With {Key .id = RouteParameter.[Optional], 
      .year = RouteParameter.[Optional], 
      .month = RouteParameter.[Optional], 
      .day = RouteParameter.[Optional]}) 

的問題是,你的Data路線通常會以WidgetAction路線可能匹配任何情況下匹配。第一場比賽總是勝利,讓你的第二條路線成爲一條無法到達的執行路線。如果您反轉訂單,則第一個路線將不匹配,前提是該網址不包含widgets作爲第二個區段,widgetaction作爲第四個區段,允許檢查Data路線。