web-dev-qa-db-fra.com

Le routage Web Api asp.net ne fonctionne pas

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."
}
12
ataravati

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.

15
Ananthan Unni

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]

7
Dalorzo

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

1
Montane