【发布时间】: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