我目前有:
config.Routes.MapHttpRoute(
name: "AccountApiCtrl",
routeTemplate: "/api" + "/account/{action}/{id}",
defaults: new { controller = "accountapi", id = RouteParameter.Optional }
);
将 / api / account / myaction请求发送到accountapi控制器。 (效果很好: - ))
但是,我宁愿不为我拥有的每个控制器执行此操作,有没有一种方法可以在这里使用正则表达式,以便我只有声明?
I.E so:/ api / account / action转到控制器:AccountApi 和 / api / user / action进入控制器:UserApi
即某事:
config.Routes.MapHttpRoute(
name: "ControllerApiMap",
routeTemplate: "/api" + "/{controller}/{action}/{id}",
defaults: new { controller = "{controller}+api", id = RouteParameter.Optional }
);
答案 0 :(得分:4)
以下是实现这一目标的一种方法:
config.Services.Replace(typeof(IHttpControllerSelector), new CustomHttpControllerSelector(config));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
public class CustomHttpControllerSelector : DefaultHttpControllerSelector
{
public CustomHttpControllerSelector(HttpConfiguration config)
: base(config)
{
}
public override string GetControllerName(HttpRequestMessage request)
{
IHttpRouteData routeData = request.GetRouteData();
if (routeData.Values.ContainsKey("controller"))
{
return routeData.Values["controller"] + "api";
}
return base.GetControllerName(request);
}
}
答案 1 :(得分:0)
请按以下方式更改正在更改正则表达式:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // Route Pattern
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Default values for parameters
new { controller = "^H.*", action = "^Index$|^Contact$" } //Restriction for controller and action
);
在这里,控制器名称以H开头,像Home一样,操作以Index或Contact开头,其他的是有限制的。