c# – 同时使用基于Web API和MVC的属性路由和基于约定的路由
作者:互联网
我有一个使用基于约定的路由的Asp.net MVC Web应用程序.我最近添加了一些Web Api 2控制器,我使用了属性路由.尽管文档声称您可以同时使用两者,但我可以使(属性路由)API方法起作用,或者(常规路由)Web应用程序方法.
这是RouteConfig.RegisterRoutes():
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Tables", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "Foo.Cms.Controllers" }
);
}
这是WebApiConfig.Register():
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
// To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
// For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
//config.EnableQuerySupport();
// The models currently only serialize succesfully to xml, so we'll remove the json formatter.
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
}
这是Application_Start():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
这样,只有到web api控制器的路由才能工作.如果我切换GlobalConfiguration.Register()和RouteConfig.RegisterRoutes(),如下所示:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
…只有基于约定的路由才有效.
我不知所措.这里发生了什么?
编辑:
我想要实现的目标:
该应用程序当前使用基本的{controller} / {action} / parameters约定.所以我有一个名为ElementsController的控制器,例如,它有一个路由到/ Elements的Index()方法或一个路由到/ Elements / ListPublic的ListPublic()方法.我通过上面提到的基于约定的路由实现了这一点.
我还有一堆Web Api控制器(例如,TablesController),我想使用/ api / v0 / tables路由路由到它.我试图这样做:
[RoutePrefix("api/v0/tables")]
public class TablesController : ApiController
{
[Route()]
public string Get()
{
// ...
}
}
如您所见,它不是相同的路由模式:api调用都以api / v0 /为前缀.但出于某种原因,它似乎仍将其视为默认的{controller} / {action}路由.
解决方法:
发生的事情是“首次注册”路线正在生效.如果我将MVC路由定义为
{控制器} / {行动} / {ID}
和定义为的Web API路由
{控制器} / {行动} / {ID}
第一条注册路线将生效.
为什么会这样?想象一下,您向服务器发送请求
富/酒吧/ 1
这匹配哪条路线?
都!
无论使用何种路由,它都将选择与路由匹配的第一个结果.如果您想了解如何使这些路由工作的示例,请查看此link
标签:c,asp-net-mvc-routing,asp-net-mvc-5,asp-net-web-api2,asp-net-web-api-routing 来源: https://codeday.me/bug/20190708/1400508.html