asp.net-mvc - Web Api 多次获取具有相同签名的路由

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

我正在构建一个网络 API,它具有多个具有相同签名的 get/post 调用。现在我知道,在多个相同调用的情况下,您通常有 2 个选择:分离到不同的 Controller 中,或者在您的路由中使用 {action} 。我已经采用了 {action} 方法,因为它最适合我相信我的大多数 Controller 。但是,在我的一个 Controller 中,我不想使用 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}

我知道我可以为此添加一个 Action 名称并调用即

api/{controller}/{action}/{venue}/{eventId}

但我觉得它打破了预期。有没有办法让我可以做一些类似的事情

api/Content/LAA/1/PST
api/Content/LAA/1?PST

此外,如果我必须走 Action 路线,我目前已经有一条路线用于其他 Controller ,但它只是使用 {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 个参数

最佳答案

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

        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} 的情况下工作。

关于asp.net-mvc - Web Api 多次获取具有相同签名的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15620142/

相关文章:

asp.net-mvc - 在MVC应用程序中启用CORS(将部署在azure上)

c# - 如何忽略 ASP.NET MVC 路由中的特定路由

C# Web Api action方法自动解码查询参数

c# - 通过 ASP.NET Web API 有效地使用 async/await

multithreading - Entity Framework 创建模型时无法使用上下文

jquery - 带有 jquery 代码的脚本 block 应该放置在 ASP.NET MVC 母版页上的什么位置?

asp.net - 如何使用 HTML.ActionLInk 构建嵌套路由 url?

http - 在 ASP.NET mvc 4,c# 中只允许一个操作使用非安全连接

c# - MvcBuildViews 忽略 ascx 和 aspx,只编译 cshtml

c# - 域模型和 View 模型之间的关系是什么?他们需要分开吗? (使用 EF 会使这个复杂化吗?)