2017-02-10 1 views
3

J'ai les 2 routes d'installation suivantes et elles fonctionnent correctement lorsqu'une demande valide est envoyée. Je voulais tester une mauvaise demande pour m'assurer que la réponse était correcte. J'essaie d'appeler l'action suivante dans mon contrôleur.Autoriser l'ID de chaîne avec l'itinéraire ASP.NET MVC

public HttpResponseMessage Get(string id) 
{ 
    //output the id again 
} 

Si j'appelle localhost:80/users/123, j'obtenir une réponse valide et il sera sortie 123. Lorsque j'essaie d'utiliser un ID non valide, par exemple, celui qui contient des lettres échoue avec l'erreur suivante.

{ « message »: « Aucune ressource HTTP a été trouvé qui correspond à la demande URI « http://localhost:80/users/d1g ». », « MessageDetail »: "Aucune action n'a été trouvé sur le contrôleur « utilisateurs » qui correspond au nom ' d1g '. "}

Je peux voir ce qui ne va pas. Cette requête doit correspondre à la première route, mais elle correspond à la seconde route. J'ai 2 méthodes appelées Get. On accepte un ID et l'autre ne nécessite pas de ID. Celui qui ne nécessite pas de ID renvoie la liste de tous les enregistrements. J'ai eu beaucoup de problèmes avec cela et la route ci-dessus est la façon dont j'ai résolu le problème.

+0

Il ne devrait pas correspondre à la première route. Cette route a une contrainte qui n'autorise que les nombres 'new {id = @" \ d + "}' pour le paramètre id. Et c'est pour qu'il ne soit pas en conflit avec le deuxième mappage d'itinéraire – Nkosi

+0

Je pense que pour votre premier GET, vous avez spécifié un masque ici: 'new {id = @" \ d + "}', essayez de le supprimer. Mais aussi je pense que vous ne devriez avoir qu'une seule méthode avec une décision simple: si 'ID' est passé, alors retourner un objet, sinon retourner une liste. Mais je prendrais un autre chemin. –

+0

Si je supprime la contrainte, j'obtiens une erreur "Plusieurs actions trouvées correspondent à la requête: \ r \ nSystem.Net.Http.HttpResponseMessage Get()". Cela a du sens car j'ai 2 méthodes get. Une qui prend un identifiant et une autre qui n'en prend aucune pour retourner une liste d'enregistrements –

Répondre

2

Mettez à jour les routes en supprimant la contrainte, en mettant à jour l'itinéraire avec l'action pour éviter les conflits et en changeant l'ordre.

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}" 
    new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional } 
); 
+0

Cela résout le problème, mais à son tour, il crée le même problème que j'avais auparavant. Plusieurs actions correspondant à la requête ont été trouvées: \ r \ nSystem.Net.Http.HttpResponseMessage Get() sur le type. Je veux un contrôleur fonctionne comme ceci/contrôleur/= get call(),/contrôleur/id = appeler get (id string) –

+0

Bingo, cela fait le travail. Je ne sais pas pourquoi, mais je pensais que le codage en dur de l'action causerait des problèmes, mais cela semble avoir fonctionné parfaitement –