I have the 2 following routes setup and they are working fine when a valid request is sent.
config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");
I wanted to test some bad request to make sure the response was correct. I am trying to call the following Action in my controller.
public HttpResponseMessage Get(string id)
{
//output the id again
}
If i call localhost:80/users/123, i get a response back that is valid and it will output 123. When i try to use an invalid ID, for example, one that contains letters it fails with the following error.
{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:80/users/d1g'.","MessageDetail":"No action was found on the controller 'Users' that matches the name 'd1g'."}
I can see whats going wrong. This request should be matching the first route, but instead its matching the second route. I have 2 methods called Get. One accepts an ID and the other doesn't require an ID. The one that does not require an ID returns a list of all records. I was having a lot of trouble with this and the route above is how i solved the issue.
new { id = @"\d+" }for id parameter. And that is so that it wont clash with the second route mappingnew { id = @"\d+" }, try removing it. But also i think you should have only one method with a simple decision: ifIDis passed then return an Object, else return a list. But I'd take another way.