使用WebAPI的MVC站点 - 忽略MVC Route Config中的API路由

时间:2016-03-22 10:53:55

标签: c# asp.net-mvc asp.net-web-api routing

我在我的MVC项目中使用了WebAPI,而我正面临着MVC路由正在处理API路由的问题。我可以通过改变路由的注册顺序来解决这个问题,例如:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    // Register API routes first 
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RouteConfig.RegisterRoutes(RouteTable.Routes);      
}

但是我想知道是否可以通过IgnoreRoute()方法执行此操作,我已尝试过:

routes.IgnoreRoute("api/{controller}/{*folder}");

但是我得到了一个404,这似乎表明该请求仍然由MVC路由处理,而不像以前那样由WebAPI处理。

这是我的API路线:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{folder}",
            defaults: new { folder = RouteParameter.Optional }
);

添加了MVC路线:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Info", action = "Index", id = UrlParameter.Optional }
        );

1 个答案:

答案 0 :(得分:2)

引入一个自定义约束,表示Controller名称不能为api

以下是基于MVC documentation

的示例
public class NoApiControllerConstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext, 
            Route route, 
            string parameterName, 
            RouteValueDictionary values, 
            RouteDirection routeDirection
        )
    {
        return values["controller"] != "api";
    }
}

routes.MapRoute(
        "Default",
        "{controller}/{action}",
        new {controller="Home"},
        new {isNotForApi=new NoApiControllerConstraint()}
);