C# 区分web api路由和mvc路由
我开始开发Web API 2支持的应用程序,因为我只想以RESTful方式检索数据 然后我需要向站点添加一些HTML,以便管理员能够管理提供的信息,因此我创建了一些MVC5控制器来返回HTML。现在我想区分WebAPI路由和MVC路由,如果可能的话,不影响生产中的WebAPI路由 Web API路由:我在这里犯的错误是在我第一次开发时删除了“API”前缀,这本来可以解决现在的冲突C# 区分web api路由和mvc路由,c#,asp.net,asp.net-mvc,asp.net-web-api2,C#,Asp.net,Asp.net Mvc,Asp.net Web Api2,我开始开发Web API 2支持的应用程序,因为我只想以RESTful方式检索数据 然后我需要向站点添加一些HTML,以便管理员能够管理提供的信息,因此我创建了一些MVC5控制器来返回HTML。现在我想区分WebAPI路由和MVC路由,如果可能的话,不影响生产中的WebAPI路由 Web API路由:我在这里犯的错误是在我第一次开发时删除了“API”前缀,这本来可以解决现在的冲突 public static void Register(HttpConfiguration config) {
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路由的现状
我试过:
- 在Global.asax.cs中切换web api路由和mvc路由的注册顺序
- 使用“web”作为MVC控制器的前缀,但路由机制认为“web”是一个控制器,并且没有找到它(WebAPI路由再次获胜)
- 我想不出一个合适的约束来避免这次碰撞
- 硬编码“管理”替换MVC路由模式中的“{controller}”
这里有解决冲突的技巧吗?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" },
);
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" },
);
正如您所知(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您从哪个控制器继承,不再有任何混淆。除此之外,如果使用.NET Core framework,还有很大的性能优势。正如您所知(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您从哪个控制器继承,不再有任何混淆。除此之外,如果使用.NET Core framework,还可以获得巨大的性能优势。最终在WebApiConfig中通过以下约束实现:
constraints: new { controller = @"(?!web).*" }
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).*" }
);
}
}
这是我的WebApiConfig:
constraints: new { controller = @"(?!web).*" }
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).*" }
);
}
}
我的路线图:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "web/{controller}/{action}/{id}",
defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional }
);
}
最后,在WebApiConfig中使用以下约束实现:
constraints: new { controller = @"(?!web).*" }
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).*" }
);
}
}
这是我的WebApiConfig:
constraints: new { controller = @"(?!web).*" }
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).*" }
);
}
}
我的路线图:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "web/{controller}/{action}/{id}",
defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional }
);
}
尽管在WebAPI和MVC之间切换了路由注册顺序,我还是尝试了一下,但没有成功。我使用“web”作为MVC的前缀,但在解决路由问题时,它进入了WebAPI路由规则,并期望“web”成为控制器。我尝试了,但没有成功,尽管在WebAPI和MVC之间切换了路由注册顺序。我使用“web”作为MVC的前缀,但在解决路由问题时,它进入了WebAPI路由规则,并期望“web”成为控制器。酷,我会考虑到这一点,也许它值得对此问题进行一些研究!酷,我会考虑到这一点,也许它值得在这个问题上进行一些研究!然后执行与web api通常执行的相反的操作。web api通常会在mvc之前注册
api
前缀和映射,以避免冲突。为mvc注册一个前缀,并在WebAPI路由之前映射它。您甚至可以尝试为mvc使用属性路由并在其中设置前缀。我尝试了,但没有成功(请参阅问题中的尝试列表),然后执行与通常对web api所做的相反的操作。web api通常会在mvc之前注册api
前缀和映射,以避免冲突。为mvc注册一个前缀,并在WebAPI路由之前映射它。您甚至可以尝试为mvc使用属性路由并在其中设置前缀。我尝试了,但没有成功(请参阅问题中的尝试列表)