web-dev-qa-db-fra.com

Une route nommée 'MS_attributerouteWebApi' se trouve déjà dans la collection de routes.

J'ai récemment ajouté Microsoft.AspNet.WebApi.WebHost à un projet MVC WebAPI, ce qui me permettait d'utiliser l'attribut [Route("api/some-action")] sur mon action. J'ai résolu quelques erreurs en utilisant cet article mais je ne peux pas résoudre la troisième erreur ci-dessous. Ajout des erreurs résolues ci-dessous pour obtenir des commentaires si je faisais quelque chose de mal.

Première erreur: aucune action n'a été trouvée sur le contrôleur 'X' qui correspond au nom 'une action'
Solution: Ajout de config.MapHttpAttributeRoutes(); à la méthode WebApiConfig.cs Register.

Second Error: System.InvalidOperationException L'objet n'a pas encore été initialisé. Assurez-vous que HttpConfiguration.EnsureInitialized () est appelée dans le code de démarrage de l'application après tout autre code d'initialisation .
Solution: Ajout de GlobalConfiguration.Configure(WebApiConfig.Register); à Global.asax.cs Application_Start

Troisième erreur: System.ArgumentException: une route nommée 'MS_attributerouteWebApi' se trouve déjà dans la collection de routes. Les noms de route doivent être uniques .
Solution =?

J'ai déjà essayé de nettoyer et de supprimer toutes les DLL du dossier bin en fonction de cet article .

17
joym8

J'ai eu un problème similaire et il était lié à une erreur de copier-coller de ma part lorsque j'ai ajouté une copie de cette ligne dans mon fichier WebApiConfig.cs:

config.MapHttpAttributeRoutes ();

assurez-vous de n'en avoir qu'un.

31
BraveNewMath

Dans le fichier Global.asax , vérifiez le nombre de fois que la fonction WebApiConfig.Register a été appelée. 

10
JoeyZhao

Résolu! Suppression de la ligne WebApiConfig.Register(GlobalConfiguration.Configuration); de Global.asax.cs Application_Start.

6
joym8

J'ai résolu en nettoyant le répertoire de déploiement avant de copier les nouveaux fichiers. Il est probable qu’un ancien fichier tente d’enregistrer plusieurs fois la même racine.

5
Davide Icardi

Si vous tombez sur cette affaire comme moi, cette erreur se produira si vous renommez le nom de l'assembly (propriétés du projet). Dans mon cas, je renommais un projet et je suis allé dans les propriétés pour changer le nom de l’Assemblée (ce que VS2013 ne fera pas pour vous).

Étant donné que le nom de l'assembly est différent, un nettoyage ou une reconstruction ne supprimera pas le "vieux" assemblage s'il se trouve dans le dossier\bin. Vous devez supprimer l'assembly du dossier\bin, puis reconstruire et exécuter.

2
VictorySaber

Vous avez probablement même enregistrer plus d'un.

Essayez de supprimer les codes ci-dessous de Global.asax:

GlobalConfiguration.Configure(WebApiConfig.Register);
  RouteConfig.RegisterRoutes(RouteTable.Routes);

et écrivez ceci à la place d’eux:

GlobalConfiguration.Configuration.EnsureInitialized (); BundleConfig.RegisterBundles (BundleTable.Bundles); 

Je ne suis pas sûr de la raison. mais cela a fonctionné pour moi dans le même cas.

1
nzrytmn

Je rencontrais également un problème similaire (pas la route MS_attributerouteWebApi en particulier, mais une route nommée différente). Après avoir vérifié qu'il n'existait que config.MapHttpAttributeRoutes(), il a commencé à réaliser que MapHttpAttributeRoutes enregistre tous les assemblys du projet, y compris ceux qui sont référencés de manière externe. Après avoir découvert que j'avais une assemblée référencée qui enregistrait ses propres itinéraires, j'ai trouvé un moyen d'exclure ou "d'ignorer" les itinéraires en remplaçant la variable DefaultDirectRouteProvider:

/// <summary>
/// Allows for exclusion from attribute routing of controllers based on name
/// </summary>
public class ExcludeByControllerNameRouteProvider : DefaultDirectRouteProvider {

    private string _exclude;
    /// <summary>
    /// Pass in the string value that you want to exclude, matches on "ControllerType.FullName" and "ControllerType.BaseType.FullName"
    /// </summary>
    /// <param name="exclude"></param>
    public ExcludeByControllerNameRouteProvider(string exclude) {
        _exclude = exclude;
    }

    protected override IReadOnlyList<RouteEntry> GetActionDirectRoutes(
    HttpActionDescriptor actionDescriptor,
    IReadOnlyList<IDirectRouteFactory> factories,
    IInlineConstraintResolver constraintResolver)
    {
        var actionRoutes = new List<RouteEntry>();
        var currentController = actionDescriptor.ControllerDescriptor.ControllerType;
        if (!currentController.FullName.Contains(_exclude) && !currentController.BaseType.FullName.Contains(_exclude))
        {
            var result = base.GetActionDirectRoutes(actionDescriptor, factories, constraintResolver);
            actionRoutes = new List<RouteEntry>(result);
        }
        return actionRoutes.AsReadOnly();
    }
}

Cela vous permet de passer un nom de contrôleur ou un nom de type de base à exclure dans votre WebApiConfig.cs comme:

config.MapHttpAttributeRoutes(new ExcludeByControllerNameRouteProvider("Controller.Name"));

Que ce soit directement lié ou non, en espérant que cet extrait puisse vous aider!

0
vandsh