编程语言
首页 > 编程语言> > c# – 同时使用基于Web API和MVC的属性路由和基于约定的路由

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