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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |