Here is my routing configuration:
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
And, here is my controller:
public class ProductsController : ApiController
{
[AcceptVerbs("Get")]
public object GetProducts()
{
// return all products...
}
[AcceptVerbs("Get")]
public object Product(string name)
{
// return the Product with the given name...
}
}
When I try api/Products/GetProducts/
, it works. api/Products/Product?name=test
also works, but api/Products/Product/test
does not work. What am I doing wrong?
UPDATE:
Here's what I get when I try api/Products/Product/test
:
{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:42676/api/Products/Product/test'.",
"MessageDetail": "No action was found on the controller 'Products' that matches the request."
}
This is because of your routing settings and its default values. You have two choices.
1) By changing the route settings to match the Product() parameter to match the URI.
2) The other and recommended way is to use the correct method signature attribute.
This is because the method is expecting a parameter id when requesting api/Products/Product/test rather than looking for a name parameter.
Your route is defining id as the parameter yet your method expects a name parameter. I prefer attribute routing if you can, then define /api/products/product/{name} on the Product method.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Based on your update:
Therefore to match this
api/Products/Product/test
based on this template"api/{controller}/{action}/{id}"
YOur method needs to be declare like this:Where the parameter
string name
was replaced bystring id
.Here is my full sample:
I tried using a totally different template:
But it worked fine on my end. Btw I additional removed
[AcceptVerbs("Get")]
and replaced them with[HttpGet]