MVC 4.5 Web API Routing not working?

余生颓废 提交于 2019-11-30 05:58:15

问题


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)
{
     ...
}

回答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




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



回答3:


@Kristof is almost right. You should make your second route:

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "api/{controller}/{id}",
    new { action = "Get" },
    new { id = @"\d+ }
    );



回答4:


This route does not know which action to bind to :

config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" });

Both of your methods are a valid candidate.
I'm not 100% clear what your setup is but in normal REST every resource has a controller, it seems like you have 1 controller with 2 resources.
To make it work in this setup you could force your second route to the get action like this :

 config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+", action="Get" });



回答5:


Make sure in your project's Global.asx file, that you've added

WebApiConfig.Register(GlobalConfiguration.Configuration);

into the Application_Start function.



来源:https://stackoverflow.com/questions/17318901/mvc-4-5-web-api-routing-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!