使用不同命名空间中的重复控制器名称路由模板

时间:2017-10-16 05:18:55

标签: c# asp.net-mvc asp.net-mvc-routing

我正在实现一些我希望将web api放在更传统的MVC实现旁边的东西。

结构如下:

+ Controllers
  + Web
    - Product.cs
  + Api
    - Product.cs

在我的代码中,我想将通过/api传入的所有请求路由到Api命名空间,并将所有其他请求路由到Web命名空间,例如:

// Want to indicate that these should all choose the the Api namespace
routes.MapRoute(
    name: "api_route",
    template: "api/{controller}/{action}/{id?}");

// Indicate that these should all choose the from the Web namespace.
routes.MapRoute(
    name: "default_route",
    template: "{controller}/{action}/{id?}");

据我所知,没有惯用的方法来指示可供选择的命名空间。有一个更好的方法吗?或者我是否需要在每个控制器的基础上手动指定路由?

编辑: 如果使用Razor视图,似乎这可能是一个没有实际意义的点。无论如何,我会留下来看看是否有人有答案。

1 个答案:

答案 0 :(得分:0)

使用Owin / Katana on可以使用app.Map来隔离请求管道。 我使用这两个启动配置来处理这些情况:

1)使用Owin Startup文件在/api主持WebApi。

app.Map("/api", builder =>
{
    var config = new HttpConfiguration();
    builder.UseWebApi(config);
});

2)从MVC中的路由集合中省略/api(在启动时在Global.asax中设置)

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

// Explicitly tell this route to be solely handled by the Owin pipeline.
RouteTable.Routes.MapOwinPath("/api");