2013-04-04 4 views
4

J'ai une situation où j'ai deux méthodes, on accepte un poco et une autre liste de poco dans ma classe de contrôleur:Comment utiliser les méthodes surchargées ASP.Net WebApi?

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] Item item) 
{ 
    m_controller.SaveItem(item);   
} 

[AcceptVerbs("PUT")] 
[ActionName("Items")] 
public void SaveItems([FromBody] List<Item> items) 
{ 
    m_controller.SaveItem(items); 
} 

ma table de routage ressemble à quelque chose comme:

routes.MapHttpRoute("Item Route", 
        "api/item/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Item", 
         orderId = RouteParameter.Optional 
        }); 

routes.MapHttpRoute("Items Route", 
        "api/items/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Items", 
         orderId = RouteParameter.Optional 
        }); 

Cela fonctionne comme prévu . Mais j'ai pensé à refactoriser le code pour essayer de surcharger. J'ai essayé de surcharger les méthodes dans mon contrôleur et ai juste une route mais elle a échoué avec l'erreur 500 - Demande Invalide. Je pensais que webapi résoudrait l'appel en vérifiant le paramètre - s'il s'agit d'une liste, il appellera la méthode surchargée avec la liste comme paramètre sinon l'autre méthode. Je comptais faire quelque chose comme:

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] Item item) 
{ 
    m_controller.SaveItem(item);   
} 

[AcceptVerbs("PUT")] 
[ActionName("Item")] 
public void SaveItem([FromBody] List<Item> items) 
{ 
    m_controller.SaveItem(items); 
} 

ma table de routage ressemble à quelque chose comme:

routes.MapHttpRoute("Item Route", 
        "api/item/{orderId}", 
        new 
        { 
         controller = "MyOrder", 
         action = "Item", 
         orderId = RouteParameter.Optional 
        }); 
+0

Quelle exception avez-vous? –

+0

Je reçois toujours "Erreur 500 - Demande invalide". Rien beaucoup. –

+0

Avez-vous eu accès à distance? –

Répondre

1

Je soupçonne que le routage ne prend pas le corps en compte. Dans votre cas, la seule façon de déterminer quelle surcharge utiliser est d'analyser le corps et de l'acheminer de manière appropriée. Une simplification que vous pourriez faire est de toujours prendre une liste d'élément avec une seule méthode. Ensuite, dans le cas d'un seul élément, il suffit d'inclure cet élément dans la liste.

+0

Je suis d'accord, c'est comme ça que nous l'avons fait pour qu'une autre API ait une seule méthode avec une liste. Je me demandais si je pouvais avoir des surcharges. –

2

L'API Web utilise un élément appelé IHttpActionSelector pour déterminer l'action à appeler dans le contrôleur. Je pense que l'implémentation par défaut ne supporte pas les surcharges pour des scénarios comme celui-ci. Vous pouvez implémenter un IHttpActionSelector personnalisé, mais cela peut demander beaucoup de travail. Jetez un oeil sur les échantillons dans ce billet de blog,

http://www.novanet.no/blog/aanund-austrheim/dates/2012/7/several-post-methods-on-an-apicontroller-using-an-actionselector/

Il serait beaucoup plus simple de soutenir un scénario unique où vous recevez toujours une liste d'éléments. Pour le cas d'un article, c'est juste une liste avec un seul article.

+0

merci pour le lien .. semble un peu plus de travail, mais ressemble à un hack. Mais sympa de penser. Mais je suppose, je devrais le rendre simple et direct en utilisant une méthode qui accepte une liste comme suggéré par Jim et comme nous l'avons fait dans une autre API. –

+1

@PabloCibraro Salut, ce lien est mort. –

Questions connexes