【问题标题】:Web Api multiple get with same signature routing具有相同签名路由的 Web Api 多次获取
【发布时间】:2013-03-25 16:38:54
【问题描述】:

我正在构建一个 web api,它具有多个具有相同签名的 get/post 调用。现在我知道,在多个相同调用的情况下,您通常有 2 个选择:分开到不同的控制器中,或者在您的路由中使用 {action}。我已经采用了 {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 个参数

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    这是我找到的答案,它几乎完全符合我的要求:

            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 会选择路线。我很可能会在稍后将动作约束提取到枚举中。

    简要说明:设置动作默认值允许路由基本上使其成为可选参数。所以每条路线都可以在没有实际设置 {action} 的情况下工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2017-09-16
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多