如何将正则表达式集成到我的MapHttpRoute for WebApi中

时间:2013-12-18 04:39:24

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

我目前有:

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

2 个答案:

答案 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开头,其他的是有限制的。