【问题标题】:How can I integrate regex into my MapHttpRoute for WebApi如何将正则表达式集成到我的 MapHttpRoute for WebApi
【发布时间】:2014-01-06 03:15:12
【问题描述】:

我目前有:

config.Routes.MapHttpRoute(
                name: "AccountApiCtrl",
                routeTemplate: "/api" + "/account/{action}/{id}",
                defaults: new { controller = "accountapi", id = RouteParameter.Optional }
            );

向 accountapi 控制器发送 /api/account/myaction 请求。 (效果很好:-))

但是,我不想为我拥有的每个控制器都这样做,有没有一种方法可以在这里使用正则表达式,以便我只在声明时使用?

我是这样的:

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

【问题讨论】:

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


    【解决方案1】:

    以下是实现此目的的一种方法:

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

    【讨论】:

      【解决方案2】:

      请按照以下方式更改您将更改正则表达式的位置:

      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 开头,其他的都是受限的。

      【讨论】:

        猜你喜欢
        • 2019-07-18
        • 2011-09-18
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 2022-01-27
        • 2012-06-10
        • 2010-12-07
        • 2018-03-21
        相关资源
        最近更新 更多