【问题标题】:How to handle this type of Web API 2 routing scenario?如何处理这种类型的 Web API 2 路由场景?
【发布时间】:2016-02-14 01:57:38
【问题描述】:

如何定义一组路由(或修改我的控制器)以允许我处理这两种类型的 URI 请求?请注意,我可以修改我的类和路由,但不能更改 URI 的结构。

示例 1 URI 正确路由WidgetsController

api/widgets/{widget id}

示例 2 URI 错误地路由WidgetsController。我希望它路由到WidgetActionController

api/widgets/{widget id}/widgetaction/{widget action 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"})

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api2 url-routing asp.net-mvc-routing asp.net-web-api-routing


    【解决方案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 路由可能匹配的每种情况。第一场比赛总是获胜,使您的第二条路线成为无法到达的执行路径。如果您颠倒顺序,如果 URL 不包含 widgets 作为第二段和 widgetaction 作为第四段,则第一个路由将不匹配,从而允许检查 Data 路由。

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2011-04-01
      相关资源
      最近更新 更多