Voici ma configuration de routage:
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Et voici mon contrôleur:
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...
}
}
Quand j'essaie api/Products/GetProducts/
, Ça marche. api/Products/Product?name=test
fonctionne aussi, mais api/Products/Product/test
ne marche pas. Qu'est-ce que je fais mal?
MISE À JOUR:
Voici ce que j'obtiens quand j'essaie 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."
}
Cela est dû à vos paramètres de routage et à ses valeurs par défaut. Vous avez deux choix.
1) En modifiant les paramètres de l'itinéraire pour qu'ils correspondent au paramètre Product () et à l'URI.
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{name}", // removed id and used name
defaults: new { name = RouteParameter.Optional }
);
2) L'autre manière recommandée est d'utiliser l'attribut de signature de méthode correct.
public object Product([FromUri(Name = "id")]string name){
// return the Product with the given name
}
En effet, la méthode attend un paramètre id lors de la demande api/Products/Product/test plutôt que de rechercher un - nom paramètre.
En fonction de votre mise à jour:
Veuillez noter que WebApi fonctionne sur la base de la réflexion, cela signifie que vos accolades {vars} doivent correspondre au même nom dans vos méthodes.
Par conséquent, pour faire correspondre ce api/Products/Product/test
Basé sur ce modèle "api/{controller}/{action}/{id}"
Votre méthode doit être déclarée comme ceci:
[ActionName("Product")]
[HttpGet]
public object Product(string id){
return id;
}
Où le paramètre string name
A été remplacé par string id
.
Voici mon échantillon complet:
public class ProductsController : ApiController
{
[ActionName("GetProducts")]
[HttpGet]
public object GetProducts()
{
return "GetProducts";
}
[ActionName("Product")]
[HttpGet]
public object Product(string id)
{
return id;
}
}
J'ai essayé d'utiliser un modèle totalement différent:
config.Routes.MapHttpRoute(
name: "test",
routeTemplate: "v2/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional, demo = RouteParameter.Optional }
);
Mais cela a bien fonctionné de mon côté. Btw I supplémentaire supprimé [AcceptVerbs("Get")]
et les a remplacés par [HttpGet]
Votre itinéraire définit id comme paramètre, mais votre méthode attend un paramètre de nom. Je préfère le routage d'attributs si vous le pouvez, puis définissez/api/products/product/{name} sur la méthode Product.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2