101 votes

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

Je réalise un service web ASP.NET MVC 3 et je reçois cette exception par intermittence.

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

C'est probablement lié au fait que Route Debugger montre que j'ai quelques anciennes routes que j'ai modifiées ou supprimées et qui ne disparaissent pas (même après le redémarrage de ma machine). La trace de pile fait également référence à un fichier source qui a été supprimé depuis longtemps et mon application a été déplacée vers un nouvel emplacement, nettoyée et reconstruite depuis lors. Que me manque-t-il ?

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 }
        );

    }
}

0 votes

Avez-vous un autre endroit où vous avez défini des itinéraires ? Des zones ?

0 votes

J'ai ajouté la trace de la pile et des informations supplémentaires sur mes routes.

304voto

Flea Points 3308

Pour résoudre ce problème, j'ai dû aller dans le dossier bin de mon projet, supprimer tous les fichiers DLL, puis reconstruire et cela a réglé le problème.

11 votes

En nettoyant simplement la solution, nous faisons la même chose.

85 votes

@Bomboca - le nettoyage ne supprime pas les DLL qui ne font pas partie du projet. Par exemple, si vous changez le nom de l'assemblage de votre projet, l'ancien assemblage restera dans la DLL. bin dossier.

2 votes

Je rencontrais le même problème et cela l'a résolu immédiatement. Merci !

21voto

Max Points 3259

Cette erreur peut être due à de multiples causes. J'ai eu la même erreur et l'ai résolue en modifiant la classe Global.asax.

La méthode Application_Start dans 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);

Ainsi, l'itinéraire a été ajouté deux fois à la liste des itinéraires et a provoqué l'erreur en même temps.

J'ai modifié 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 cela peut peut-être aider d'autres personnes à l'avenir. Je n'ai pas vu cette réponse parmi les autres, alors j'ai décidé de l'ajouter.

2 votes

Il y a également un appel en double à AreaRegistration.RegisterAllAreas().

0 votes

J'ai aussi rencontré ce problème : WebApiConfig.Register(GlobalConfiguration.Configuration) ; avec GlobalConfiguration.Configure(WebApiConfig.Register) ; tous deux appelant la même méthode dans WebApiConfig.cs. Le truc est bien sûr de faire une pause à l'endroit où le nom de la route est défini et de regarder la pile d'appels.

0 votes

J'obtenais cette erreur et aucune des autres solutions ne fonctionnait pour moi, mais j'ai ensuite trouvé des lignes AreaRegistration.RegisterAllAreas() ; en double dans mon fichier global.asax. En supprimant l'une d'entre elles, l'erreur a disparu.

11voto

Rn222 Points 723

J'ai découvert que Global.asax faisait référence à une ancienne version du fichier DLL du site avant que je ne le renomme. La DLL n'a pas été nettoyée lorsque j'ai fait Build > Clean up parce que le projet/solution VS n'y faisait plus référence. Il semble que parfois seule la version la plus récente de la DLL était utilisée, permettant au site de fonctionner correctement, mais finalement les deux étaient chargées, provoquant les conflits de route.

0 votes

La suppression de bin et obj a fonctionné pour moi après avoir renommé mon projet.

3 votes

Comment avez-vous découvert que le fichier Global.asax faisait référence à une ancienne DLL ?

0 votes

@xiasoft : L'ancienne DLL contenait des routes que j'avais supprimées mais Route Debugger a montré qu'elles étaient toujours là. Lorsque j'ai supprimé l'ancienne DLL, les anciennes routes ont également été supprimées.

5voto

Filip W Points 13343

Les routes sont chargées à partir de tous les assemblages de AppDomain.CurrentDomain, donc si vos anciens assemblages en font toujours partie, il se peut que vous obteniez encore des routes anciennes/dupliquées.

3 votes

Comment puis-je vérifier si c'est le problème ?

0 votes

C'est vrai. C'est arrivé sur mon projet. Quand j'ai changé son nom, cette erreur s'est produite. Après avoir supprimé l'ancien assemblage, l'erreur a disparu.

0voto

Je reçois la même erreur. Mais finalement, j'ai trouvé une solution. Scénario : J'ajoute une dll différente (application mvc4) dans mon application web api mvc4. Quand j'essaie de l'exécuter. J'obtiens la même erreur. Cause fondamentale : Lorsque mon application api web s'exécute, l'application enregistre tous les domaines de l'auto et commence à charger les références dll du domaine de l'application actuelle. Lorsque l'application charge la dll (application MVC4), elle obtient une erreur parce que le maproute actuel a déjà ajouté une clé pour "HelpPage_Default".

Solution. Changez la clé pour RegisterArea dans maproute soit l'application actuelle ou l'application existante (référez-vous à la dll). Déplacer le code de la dll (application mvc4) vers une autre bibliothèque et faire référence à la nouvelle dll.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X