Plusieurs types de contrôleurs ont été trouvés correspondant à l'URL. Cela peut se produire si les routes d'attribut sur plusieurs contrôleurs correspondent à l'URL demandée
...crois que je suis le premier à poser à ce sujet une?
Dire que vous avez les itinéraires suivants, chaque déclaré sur un autre contrôleur:
[HttpGet, Route("sign-up/register", Order = 1)]
[HttpGet, Route("sign-up/{ticket}", Order = 2)]
... vous pourriez le faire dans MVC 5.0 avec le même code, sauf pour les Order
paramètre. Mais après la mise à jour MVC 5.1, vous obtenez le message de l'exception à la question du titre:
Plusieurs types de contrôleurs ont été trouvés qui correspondent à l'URL. Cela peut
arriver si l'attribut itinéraires sur plusieurs contrôleurs de correspondre à la demande
URL.
De sorte que le nouveau RouteAttribute.Order
propriété est à seulement contrôleur de niveau? Je sais que dans AttributeRouting.NET vous pouvez faire SitePrecedence
trop. Est la seule façon d'avoir des routes, comme ci-dessus, lorsque toutes les actions sont dans le même contrôleur?
Mise à jour
Désolé, je devrais avoir mentionné ces itinéraires sont sur des contrôleurs MVC, pas WebAPI. Je ne suis pas sûr de savoir comment cela affecte ApiControllers.
source d'informationauteur danludwig
Vous devez vous connecter pour publier un commentaire.
Dans le cas de l'Attribut de routage, Web API essaie de trouver tous les contrôleurs qui correspondent à une demande. Si elle voit que plusieurs contrôleurs sont en mesure de gérer cela, alors il se lève une exception, car elle estime que c'est probablement une erreur de l'utilisateur. Cette voie de sondage est différent de l'acheminement où le premier match gagne.
Comme une solution de contournement, si vous disposez de ces deux actions, au sein d'un même contrôleur, puis de l'API Web a les honneurs de la route prioritaire et vous devriez voir votre scénario de travail.
Si vous savez que
ticket
sera unint
vous pouvez spécifier le type de la route pour aider à résoudre la route:[HttpGet, Route("sign-up/register")]
[HttpGet, Route("sign-up/{ticket:int}")]
Cette approche a fonctionné pour moi, par user1145404 du commentaire qui comprend un lien vers Plusieurs Types de contrôleurs avec le même préfixe de l'Itinéraire ASP.NET Web Api
Il y a deux façons de résoudre ce problème:
Une regex contrainte, comme ici: MVC Route Attribut erreur sur deux voies différentes
Ou un itinéraire personnalisé contrainte, comme ici: https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/
Vous pouvez créer de route personnalisé contraintes par la mise en œuvre de la IRouteConstraint interface. Par exemple, la contrainte limite d'un paramètre à un ensemble de valeurs valides:
Le code suivant montre comment enregistrer de la contrainte:
Maintenant, vous pouvez appliquer la contrainte dans vos itinéraires:
À mon avis, ce n'est pas super design. Il n'y a pas de jugements sur ce que l'URL que vous avez prévu et pas de spécificité des règles lors de l'appariement, sauf si vous explicitement définir vous-même. Mais au moins, vous pouvez obtenir votre Url à la recherche de la façon dont vous le souhaitez. Nous espérons que votre liste de contrainte n'est pas trop long. Si c'est, ou que vous ne voulez pas dur de code de la route paramètre de chaîne et de ses contraintes, vous pourriez créer par programmation à l'extérieur de la méthode d'action et de le nourrir à la Route de l'attribut comme une variable.