How to integrate regex into my MapHttpRoute for WebApi

I currently have:

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

which sends requests / api / account / myaction to accountapi controller . (it works great :-))

However, I would prefer not to do this for every controller that I have, is there a way I can use the regex here so that I only have the declaration?

IE like this:

/ api / account / action goes to the controller: AccountApi and also / api / user / action goes to the controller: UserApi

ie something like strings:

config.Routes.MapHttpRoute(
                name: "ControllerApiMap",
                routeTemplate: "/api" + "/{controller}/{action}/{id}",
                defaults: new { controller = "{controller}+api", id = RouteParameter.Optional }
            );
+4
source share
2 answers

Below is one way to achieve this:

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

, , , regex:

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 like Home , .

0

All Articles