【问题标题】:ASP.NET MVC 4 ApiController and Normal Controller RoutesASP.NET MVC 4 ApiController 和普通控制器路由
【发布时间】:2013-09-03 00:52:00
【问题描述】:

我有一个项目仅用于向我们的应用程序发出 API 请求,并且我们使用的是 ASP.NET MVC 4 项目。我们有一些从 ApiController 派生的控制器和其他从普通控制器类派生的控制器。问题是我不想为api/XXXXX/ 的 ApiControllers 设置默认路由。我希望 ApiController 与非 Api 控制器使用相同的路由,即{controller}/{action}/{id}。我尝试添加以下路线

routes.MapHttpRoute(
    name: "Api",
    routeTemplate: "{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这将使我的 ApiController 可以使用普通的 {controller}/{action} 路由访问,但“普通”控制器不再可访问。如果我摆脱MapHttpRoute,则会发生相反的情况。

有没有办法让 ApiControllers 和“普通”控制器通过相同的 url 路由访问?

【问题讨论】:

  • 在我看来,您要问的是“如果我给 MVC 提供两条相同的路线可供选择, 是否可以决定 是否想要标准还是 API?”。如果这是正确的,那么答案很简单。 只能按照它的吩咐去做,它不能做决定。
  • 我想我没有意识到它必须在路由时做出任何决定。我认为它会在控制器级别而不是路由级别找出 api 逻辑。没有意识到它需要提前知道。我确实发现我可以将每个控制器名称显式定义为新路由,但它会起作用。每个控制器都需要一个路由定义,但总比没有好。
  • @flem - 有一些附加信息可用于确定使用哪个控制器: 请求的 Accept 标头中的内容类型。如果有办法告诉 MVC 响应 HTML 请求并将其他请求转发到 Web API 控制器,那么这将起作用。我并不是说它可能或实用,如果 MVC 和 WebAPI 可以一起玩就好了:-) 例如: GET /users/1 [Accept: text/html] 调用 MVC 响应。 GET /users/1 [Accept: application/json] 调用 Web API 响应。

标签: asp.net-mvc asp.net-mvc-4 asp.net-apicontroller


【解决方案1】:

据我所知,唯一可以做到这一点的方法是明确命名每个 API 控制器。下面我有一个 SomeApiController 类。

routes.MapHttpRoute(
    name: "SomeApiController",
    routeTemplate: "SomeApi/{action}/{id}",
    defaults: new { controller = "SomeApi", id = RouteParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

【讨论】:

  • 您也可以在 ApiControllers 上使用属性路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2013-08-04
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多