区分web api路由和mvc路由

时间:2016-08-01 12:16:58

标签: c# asp.net asp.net-mvc asp.net-web-api2

我开始开发 Web API 2 支持的应用程序,因为我只是想以RESTful方式检索数据。

然后我需要向网站添加一些HTML,以便管理员管理所提供的信息,因此我创建了一些 MVC 5 控制器来返回HTML。现在我想区分Web API路由和MVC路由,如果可能的话,不会影响正在生产的Web API路由。

Web API路由:我的错误就是在我第一次开发这个时删除了“api”前缀,现在已经解决了碰撞

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”是控制器而未找到(Web api路由再次获胜)。
  • 我无法想出一个适当的约束来避免这种碰撞。
  • 硬编码“管理”替换MVC路由模式中的“{controller}”。

这里有一些技巧来解决碰撞吗?

3 个答案:

答案 0 :(得分:1)

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" },
  );

答案 1 :(得分:1)

最后在WebApiConfig中使用以下约束:

null

所以,这是我的WebApiConfig:

constraints: new { controller = @"(?!web).*" }

我的RouteConfig:

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).*" }
            );
        }
    }

答案 2 :(得分:0)

您也知道(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您继承的控制器没有更多的困惑。除此之外,如果使用.NET Core框架,还有很大的性能优势。