MVC 4.5 Web API Routing not working?

前端 未结 5 1136
感情败类
感情败类 2020-12-10 19:32

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<

相关标签:
5条回答
  • 2020-12-10 19:40

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

    config.Routes.MapHttpRoute(
        "DefaultApiWithId", 
        "api/{controller}/{id}",
        new { action = "Get" },
        new { id = @"\d+ }
        );
    
    0 讨论(0)
  • 2020-12-10 19:46

    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 }
            );
        }
    }
    
    0 讨论(0)
  • 2020-12-10 20:01

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

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    

    into the Application_Start function.

    0 讨论(0)
  • 2020-12-10 20:02

    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

    0 讨论(0)
  • 2020-12-10 20:02

    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" });
    
    0 讨论(0)
提交回复
热议问题