加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 同时使用基于Web API和MVC的属性路由和基于约定的路由

发布时间:2020-12-15 22:14:49 所属栏目:百科 来源:网络整理
导读:我有一个使用基于约定的路由的 Asp.net MVC Web应用程序.我最近添加了一些Web Api 2控制器,我使用了属性路由.尽管文档声称您可以同时使用两者,但我可以使(属性路由)API方法起作用,或者(常规路由)Web应用程序方法. 这是RouteConfig.RegisterRoutes(): public
我有一个使用基于约定的路由的 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读