The default controller web api gives you has the following pattern The built in GET,POST,PUT convention that web API.supports .I have found to support extra GET methods and support the normal REST methods as well.
public class MyController : ApiController { // GET api/test public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/test/5 public string Get(int id) { return "value"; } // POST api/test public void Post([FromBody]string value) { } // PUT api/test/5 public void Put(int id, [FromBody]string value) { } // DELETE api/test/5 public void Delete(int id) { } } the Problems start when you want to define more than one “GET” method that goes by a different name.which always get one method & give Error.
public class MyController : ApiController { // GET api/test public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/test/GetAllWithFilter [HttpGet] public IEnumerable<string> GetAllWithFilter() { return new string[] { "value1"}; } // GET api/test/5 public string Get(int id) { return "value"; } // POST api/test public void Post([FromBody]string value) { } // PUT api/test/5 public void Put(int id, [FromBody]string value) { } // DELETE api/test/5 public void Delete(int id) { } }
This shouldn’t be that hard to fix on the surface but the built in route that enables this convention.I searched around for a while to figure out how to solve this then finally ran across a great Stackoverflow post here that nails it and http://lonetechie.com/2013/03/04/fixing-multiple-actions-were-found-that-match-the-request-aspnet-webapi/.
Replace your built in route in WebApiConfig with this (updated for latest release).
config.Routes.MapHttpRoute("DefaultApiWithId", "api/v1/{controller}/{id}",
new{ id = RouteParameter.Optional}, new{ id =@"\d+"});
config.Routes.MapHttpRoute("DefaultApiWithAction", "api/v1/{controller}/{action}");
config.Routes.MapHttpRoute("DefaultApiGet", "api/v1/{controller}",
new{ action ="Get"}, new{ httpMethod =new HttpMethodConstraint(HttpMethod.Get)});
config.Routes.MapHttpRoute("DefaultApiPost", "api/v1/{controller}",
new{ action ="Post"}, new{ httpMethod =new HttpMethodConstraint(HttpMethod.Post)});
config.Routes.MapHttpRoute("DefaultApiPut", "api/v1/{controller}",
new{ action ="Put"}, new{ httpMethod =new HttpMethodConstraint(HttpMethod.Put)});
config.Routes.MapHttpRoute("DefaultApiDelete", "api/v1/{controller}",
new{ action ="Delete"}, new{ httpMethod =new HttpMethodConstraint(HttpMethod.Delete)});