MVC 4.5 Web API Routing not working?
10,340
Solution 1
For MVC 4.5 this is the only thing that works
There is currently a bug about this.
In order to get your routing to work so the following work
api/Shelves/ //Get All Shelves
api/SpaceTypes/1 //Get Shelf of id 1
api/Shelves/1/SpaceTypes/ //Get all space types for shelf 1
you need to do the following.
Change your routing over to. (Note the default action..)
config.Routes.MapHttpRoute(
name : "DefaultAPi",
routeTemplate : "api/{controller}/{id}/{action}",
defaults: new {id= RouteParameter.Optional,
action = "DefaultAction"}
);
In your controller change the base methods over to
[ActionName("DefaultAction")]
public string Get()
{
}
[ActionName("DefaultAction")]
public string Get(int id)
{
}
[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}
Now everything should work as expected..
Thanks to Kip Streithorst full this, for a full explanation
Solution 2
I had a similar issue and discovered i wasn't calling MapHttpAttributeRoutes method in my WebApiConfig...
hope it helps, David
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Solution 3
@Kristof is almost right. You should make your second route:
config.Routes.MapHttpRoute(
"DefaultApiWithId",
"api/{controller}/{id}",
new { action = "Get" },
new { id = @"\d+ }
);
Author by
Dave
Updated on June 04, 2022Comments
-
Dave almost 2 years
The 1st route works.
e.g.
api/Shelves/SpaceTypes/1
The 2nd route doesn't work. I get multiple actions error.
e.g
api/Shelves/1
Q) Why?
These are my routes:
config.Routes.MapHttpRoute( "DefaultApiWithAction", "api/{controller}/{action}/{id}" ); config.Routes.MapHttpRoute( "DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" } );
This is my controller:
public HttpResponseMessage Get(int id) { ... } [ActionName("SpaceTypes")] public HttpResponseMessage GetSpaceTypes(int id) { ... }
-
Dave almost 11 yearsthanks, but this doesn't work. I don't have 2 resource types on 1 controller. I have a singular resource type, with another method to get sub-information about that resource by its id.
-
Dave almost 11 yearsthanks, I'd love to meet you one day and thank you personally