Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asp.Net Web API Routing not hitting custom action

Here is my code:

public class SecurityController : ApiController
{
    //GET api/Security/Current
    public HttpResponseMessage GetCurrent(){

    }
    //POST api/Security/Login
    public HttpResponseMessage PostLogin(LoginModel model){

    }
}

public class OrdersController : ApiController
{
    [ActionName("Default")] //GET api/Orders
    public HttpResponseMessage Get(){

    }

    [ActionName("Default")] //GET api/Orders/2
    public HttpResponseMessage Get(long id){

    }

    [ActionName("Default")] //POST api/Orders/
    public HttpResponseMessage Post(Order order){

    }

    [ActionName("Default")] //DELETE api/Orders/2
    public HttpResponseMessage Delete(long id){

    }
    [HttpPost] //POST api/Orders/2/PerformAction
    public HttpResponseMessage PerformAction(long id, ActionMsg action){

    }

}

//Route definitions

        config.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}");
        config.Routes.MapHttpRoute("WithActionApi", "api/{controller}/{id}/{action}");
        config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "Default" }, new { id = @"\d+" });

My routing is not working.

No HTTP resource was found that matches the request URI 

What is the correct route definition for my API controller? Thanks!

like image 582
Amitava Avatar asked Dec 17 '25 15:12

Amitava


1 Answers

Change your SecurityController to:

public class SecurityController : ApiController
{
    //GET api/Security/Current
    [HttpGet]
    [ActionName("current")]
    public HttpResponseMessage GetCurrent(){

    }
    //POST api/Security/Login
    [HttpPost]
    [ActionName("login")]
    public HttpResponseMessage PostLogin(LoginModel model){

    }
}

And then change your routing to:

config.Routes.MapHttpRoute("ActionApi",
  "api/{controller}/{action}",
  null,
  new { action = @"[a-zA-Z]+" });

config.Routes.MapHttpRoute("WithActionApi",
  "api/{controller}/{id}/{action}");

config.Routes.MapHttpRoute("DefaultApi",
  "api/{controller}/{id}",
  new { id = RouteParameter.Optional, action = "Default" },
  new { id = @"\d*" });

Note the regex "\d*" is required in the last route rather than "\d+".

like image 131
Jon Susiak Avatar answered Dec 19 '25 06:12

Jon Susiak