我在我的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 }
);
答案 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()}
);