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+ }
    );
Share:
10,340
Dave
Author by

Dave

Updated on June 04, 2022

Comments

  • Dave
    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
    Dave almost 11 years
    thanks, 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
    Dave almost 11 years
    thanks, I'd love to meet you one day and thank you personally