我开始开发 Web API 2 支持的应用程序,因为我只是想以RESTful方式检索数据。
然后我需要向网站添加一些HTML,以便管理员管理所提供的信息,因此我创建了一些 MVC 5 控制器来返回HTML。现在我想区分Web API路由和MVC路由,如果可能的话,不会影响正在生产的Web API路由。
Web API路由:我的错误就是在我第一次开发这个时删除了“api”前缀,现在已经解决了碰撞
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults:
new {
controller = "Parking",
action = "Get",
id = RouteParameter.Optional
}
);
}
MVC路由:默认路由。 MVC控制器名称为“管理”,即MVC路由仅用于管理站点
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional }
);
}
问题是MVC路由没有机会匹配,因为WebAPI路由首先匹配。只要他们只是工作,MVC路线需要如何改变并不重要,因为它们尚未投入生产;对我来说,保持Web API路径比现在更好。
我试过了:
这里有一些技巧来解决碰撞吗?
答案 0 :(得分:1)
MVC控制器的Web前缀将起作用。在这种情况下,首先配置MVC的路由(在为API配置路由之前)。
将以下约束添加到API
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults:
new {
controller = "Parking",
action = "Get",
id = RouteParameter.Optional
},
constraints: new { controller = @"^web" },
);
答案 1 :(得分:1)
最后在WebApiConfig中使用以下约束:
null
所以,这是我的WebApiConfig:
constraints: new { controller = @"(?!web).*" }
我的RouteConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults:
new
{
controller = "Parking",
action = "Get",
id = RouteParameter.Optional
},
constraints: new { controller = @"(?!web).*" }
);
}
}
答案 2 :(得分:0)
您也知道(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您继承的控制器没有更多的困惑。除此之外,如果使用.NET Core框架,还有很大的性能优势。