There are two problems in the code. You are using MapRoute instead of MapHttpRoute. You must first specify a more detailed route so that it does not swallow a more general route:
routes.MapHttpRoute( name: "Customer", url: "api/Customer/{id}", defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional } ); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
Now, if you want your solution to be more general (when you have more controllers that need to be changed in this way), you can use the custom HttpControllerRouteHandler to translate the names of the incoming controllers, so you can support default routing.
First you need to create a custom HttpControllerRouteHandler :
public class CustomHttpControllerRouteHandler : HttpControllerRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString() + "Api"; return base.GetHttpHandler(requestContext); } }
Now you can register your HttpRoute as follows:
routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ).RouteHandler = new CustomHttpControllerRouteHandler();
That way, when you put the customer in the URL, the engine will treat it as CustomerApi.
tpeczek
source share