web-dev-qa-db-fra.com

Une route nommée "x" est déjà dans la collection de routes. Les noms de route doivent être uniques. Exception avec ASP.NET MVC 3

Je fais un service Web ASP.NET MVC 3 et je continue à recevoir cette exception de façon intermittente. 

Trace de la pile:

Server Error in '/' Application.

A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name

Source Error: 


Line 24:            //     }
Line 25:            // );
Line 26:             context.MapRoute(
Line 27:                 "ListTables",
Line 28:                 // example: 

Source File: C:\inetpub\wwwroot\SchemaBrowserService\Website\Areas\Api\ApiAreaRegistration.cs    Line: 26 

Stack Trace: 


[ArgumentException: A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name]
   System.Web.Routing.RouteCollection.Add(String name, RouteBase item) +2329682
   System.Web.Mvc.RouteCollectionExtensions.MapRoute(RouteCollection routes, String name, String url, Object defaults, Object constraints, String[] namespaces) +236
   System.Web.Mvc.AreaRegistrationContext.MapRoute(String name, String url, Object defaults, Object constraints, String[] namespaces) +59
   System.Web.Mvc.AreaRegistrationContext.MapRoute(String name, String url, Object defaults) +17
   SchemaBrowserService.Areas.Api.ApiAreaRegistration.RegisterArea(AreaRegistrationContext context) in C:\inetpub\wwwroot\SchemaBrowserService\Website\Areas\Api\ApiAreaRegistration.cs:26
   System.Web.Mvc.AreaRegistration.CreateContextAndRegister(RouteCollection routes, Object state) +105
   System.Web.Mvc.AreaRegistration.RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, Object state) +199
   System.Web.Mvc.AreaRegistration.RegisterAllAreas(Object state) +45
   System.Web.Mvc.AreaRegistration.RegisterAllAreas() +6
   Website.MvcApplication.Application_Start() in C:\Users\djackson\Downloads\RestApiMvc3\Website\Website\Global.asax.cs:35

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272

Cela est probablement dû au fait que Route Debugger montre que j'ai d'anciens itinéraires que j'ai modifiés ou supprimés et que je ne vais pas partir (même après le redémarrage de ma machine). La trace de la pile fait également référence à un fichier source supprimé depuis longtemps et mon application a été déplacée vers un nouvel emplacement, nettoyée et reconstruite depuis. Qu'est-ce que je rate?

Voici tout le code d'enregistrement de mon itinéraire:

// in Global.asax.cs:
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default2", // Route name
        "Api/{controller}/{action}/{id}", // URL with parameters
        new { controller = "DataSource", action = "Index", area = "Api", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
}

// in ApiAreaRegistration.cs:
public class ApiAreaRegistration : AreaRegistration
{
    public override string AreaName { get { return "Api"; } }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        // DataSources

        // Tables
        context.MapRoute(
            "ListTables",
            // example: 
            // /api/DataSources/DataSource/1/schemata/schema/dbo/tables
               "Api/DataSources/DataSource/{dataSourceId}/schemata/{schemaName}/tables",
            new
            {
                controller = "Tables",
                action = "TableList",
                schemaName = "dbo",
                dataSourceId = "DefaultId"
            }
        );


        // Schemata
        context.MapRoute(
          "Schema",
            // example: 
            // /api/DataSources/DataSource/1/schemata/schema/dbo
              "Api/DataSources/DataSource/{dataSourceId}/schemata/{schemaName}",
          new
          {
              controller = "Schema",
              action = "Schema",
              dataSourceId = "DefaultId",
              schemaName = UrlParameter.Optional
          }
       );

       // // DataSources
        context.MapRoute(
            "SingleDataSource",
            "Api/DataSources/DataSource/{dataSourceId}",
            new
            {
                controller = "DataSource",
                action = "DataSource",
                dataSourceId = UrlParameter.Optional
            }
        );
        context.MapRoute(
            "ListDataSources",
            "Api/DataSources",
            new
            {
                controller = "DataSource",
                action = "DataSourceList",
                dataSourceId = "DefaultId"
            }
        );
        context.MapRoute(
             "Api_default",
             "Api/{controller}/{action}/{id}",
             new { action = "Index", id = UrlParameter.Optional }
        );

    }
}
88
Rn222

Pour résoudre ce problème, je devais accéder au dossier bin de mon projet, supprimer tous les fichiers DLL, puis reconstruire, ce qui corrigeait le problème.

273
Flea

Cette erreur peut survenir pour plusieurs raisons. J'ai eu la même erreur et je l'ai résolue en modifiant la classe Global.asax.

La méthode Application_Start chez Global.asax.cs était comme:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

La ligne suivante apparaît deux fois dans cette méthode:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Cela garantissait que l'itinéraire était ajouté deux fois à la liste des itinéraires et en même temps provoquait l'erreur.

J'ai changé la méthode Application_Start comme suit et l'erreur a disparu:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ce n'est peut-être pas la solution à votre problème, mais peut peut-être aider les autres à l'avenir. Je n'ai pas vu cette réponse entre les autres, alors j'ai décidé de l'ajouter.

15
Max

J'ai découvert que Global.asax faisait référence à une ancienne version du fichier DLL du site avant de le renommer. La DLL n'était pas nettoyée lorsque j'ai créé> Nettoyer parce que le projet/la solution de VS ne s'y référait plus. Il semble que parfois seule la version la plus récente de la balise DLL était utilisée, permettant ainsi au site de fonctionner correctement, mais les deux seraient éventuellement chargées, ce qui causerait des conflits de route. 

9
Rn222

Les itinéraires sont chargés à partir de tous les assemblys au sein d'AppDomain.CurrentDomain. Par conséquent, si vos anciens assemblages en font toujours partie, il est possible que vous obteniez toujours d'anciens itinéraires/doublons.

4
Filip W

Dans mon cas, j’ai fait face à ce problème lorsque j’ai ajouté la référence à un autre projet de solution, qui était également MVC et qui utilisait les mêmes noms dans la même région (je ne voulais pas ajouter ce projet, je ne sais pas comment cela s’est passé ). Lorsque j'ai supprimé cette DLL, le projet a commencé à fonctionner.

2
DreamEvil

Aucune des suggestions n'a fonctionné pour moi. Je suis allé de l'avant et a redémarré le serveur Web (IIS dans ce cas) et cela a effacé l'erreur après avoir corrigé le code. DLL doit avoir été mis en cache dans IIS. 

1
joel1618

La suppression des DLL à elle seule ne fonctionnait pas pour moi (dans VS2013), mais la suppression de la totalité des dossiers 'bin' et 'obj', puis la construction de la solution fonctionnaient parfaitement! J'espère que je n'ai pas passé autant de temps à essayer de résoudre ce problème ...

1
Lyall

J'utilisais un ancien site Web MVC2 et j'ai eu ce problème parce que le IIS "Mode pipeline géré" était défini par défaut sur "Intégré" (appuyez sur F4 du projet). Le changer en 'Classic' a résolu le problème

0
Phate01

Je reçois la même erreur. Mais finalement j'ai la solution. Scénario: J'ajoute une dll différente (application mvc4) dans mon application Web api mvc4. Quand essayer de courir. Je reçois la même erreur . Cause principale: lorsque mon application Web est exécutée. Les applications enregistrent toutes les zones de leur propre compte et commencent à se charger dans les références dll actuelles du domaine d'applications. Lorsque l’application charge les dll (application MVC4), cette erreur se produit car la commande actuelle maproute ajoute déjà la clé pour "HelpPage_Default".

Solution . 1.Touche de changement pour RegisterArea dans maproute, application actuelle ou existante (référence de la DLL) . 2. Transférez le code dll (application mvc4) dans une bibliothèque différente et reportez-vous à la nouvelle DLL.

0
Raj Kishor Gupta

Supprimer les dll du dossier bin fonctionnait à 100%, il me restait encore des dll que mon projet devait reconstruire . Créez plutôt une copie du dossier bin. puis supprimez l'original. reconstruisez le projet. Si cela échoue, placez les DLL manquantes dans le dossier bin.

0
Terry Mosoma

J'appelais manuellement AttributeRoutingHttpConfig.Start() dans mon fichier Global.asax. N'a pas remarqué cette ligne générée automatiquement en haut du fichier qui l'appelle automatiquement.

[Assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
0
Despertar

essayez ce code, changez seulement le nom 

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapHttpRoute(
          name: "API",
          routeTemplate: "api/{controller}/{action}",
          defaults: new { action = "GetAgentId" }
      );
0
Mahadev Sharma

J'avais une application qui était une application Forms migrée vers MVC avec un composant tiers utilisé pour l'authentification et redirigée vers un autre site . Le composant démarrerait une session deux fois si l'utilisateur n'était pas déjà connecté (une fois pour la connexion initiale sur le site et une fois pour le retour) . Donc, j'ai résolu ce problème avec le code suivant:

if (routes.Count < 3)
            {
                routes.IgnoreRoute("login.aspx");
                routes.IgnoreRoute("default.aspx");
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new {action = "Index", id = UrlParameter.Optional}
                    );
            }

0
done_merson