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

98

Je fais un service Web ASP.NET MVC 3 et je continue à recevoir 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 d'anciennes routes que j'ai modifiées ou supprimées et qui ne disparaîtront 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 depuis longtemps été supprimé 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 mon code d'enregistrement d'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 }
        );

    }
}
Rn222
la source
Avez-vous un autre endroit où vous avez défini des itinéraires? Domaines?
Shyju du
J'ai ajouté la trace de pile et ajouté des informations supplémentaires sur mes itinéraires.
Rn222 du

Réponses:

297

Pour résoudre ce problème, je devais aller dans le dossier bin de mon projet, supprimer tous les fichiers DLL puis reconstruire et cela a résolu le problème.

Puce
la source
11
Nettoyer simplement la solution, nous faisons la même chose.
Fabio Milheiro
84
@Bomboca - le nettoyage ne supprime pas les DLL qui ne font pas partie du projet. Par exemple, si vous modifiez le nom de l'assembly de votre projet, l'ancien assembly restera dans le bindossier.
Josh M.
2
J'avais le même problème et cela a résolu mon problème immédiatement. Je vous remercie!
Aluan Haddad
1
J'ai renommé mon projet et l'ancienne DLL était toujours dans le dossier bin. S'il vous plaît les gens: solution permanente, lors de la publication, supprimez d'abord tous les fichiers du répertoire cible! (option lors de la publication dans l'annuaire)
StijnSpijker
2
Je ne sais pas pourquoi mais "Clean solution" ne fonctionne pas pour moi. Votre solution fonctionne.
user2980426
19

Cette erreur peut survenir en raison de plusieurs causes, j'ai eu la même erreur et je l'ai résolue en modifiant la classe Global.asax.

La méthode Application_Start sur 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 cela peut peut-être aider d'autres personnes à l'avenir. Je n'ai pas vu cette réponse entre les autres, j'ai donc décidé d'ajouter ceci.

Max
la source
2
Il y a un double appel à AreaRegistration.RegisterAllAreas () aussi.
Spivonious du
En outre, j'ai rencontré ceci: WebApiConfig.Register (GlobalConfiguration.Configuration); avec GlobalConfiguration.Configure (WebApiConfig.Register); tous deux appelant la même méthode dans WebApiConfig.cs. L'astuce consiste bien sûr à faire une pause là où le nom de l'itinéraire est défini et à regarder la pile d'appels.
Reid
J'obtenais cette erreur et aucune des autres solutions ne fonctionnait pour moi, mais j'ai trouvé AreaRegistration.RegisterAllAreas () en double; lignes dans mon fichier global.asax. La suppression de l'un d'entre eux a supprimé l'erreur.
ewomack
10

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 fait Build> Clean up car 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 seraient chargés, provoquant des conflits de route.

Rn222
la source
la suppression de bin et obj a fonctionné pour moi après avoir renommé mon projet.
Steve
3
Comment avez-vous découvert que Global.asax faisait référence à une ancienne DLL?
xaisoft le
@xiasoft: L'ancienne DLL contenait des routes que j'avais supprimées mais le débogueur de route montrait qu'elles étaient toujours là. Lorsque j'ai supprimé l'ancienne DLL, les anciennes routes ont également été supprimées.
Rn222 le
4

Les routes sont chargées à partir de tous les assemblys dans AppDomain.CurrentDomain, donc si vos anciens assemblys en font toujours partie, vous pouvez toujours obtenir des routes anciennes / dupliquées.

Filip W
la source
3
Comment puis-je vérifier si tel est le problème?
Rn222 du
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.
bafsar
3

Dans mon cas, j'ai été confronté à ce problème, lorsque j'ai ajouté une référence à un autre projet de la solution, qui était également MVC et que j'utilise les mêmes noms dans la zone (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.

DreamEvil
la source
Je n'avais même pas pensé que cela pouvait arriver, car j'ai toujours gardé mes projets de site autonomes au lieu de diviser les choses en une douzaine de morceaux "parce que l'architecture". Nouvelle équipe, nouvelles conventions, nouvelles chances d'intérioriser certaines des options que je n'avais pas encore trouvées utiles.
brichins
2

La suppression des DLL seules ne fonctionnait pas pour moi (dans VS2013), mais la suppression de l'ensemble des dossiers «bin» et «obj», puis la création de la solution fonctionnait parfaitement! Ça me fait regretter de ne pas avoir passé si longtemps à essayer de le réparer ...

Lyall
la source
1

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

joel1618
la source
1

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" }
      );
Mahadev Sharma
la source
0

J'obtiens la même erreur. Mais finalement j'ai une solution. Scénario: j'ajoute une DLL différente (application mvc4) dans mon application mvc4 de l'API Web. Quand essayez de courir. J'obtiens la même erreur. Cause racine - Lorsque mon application Web api s'exécute .Application enregistre toute la zone de soi et commence le chargement des références de dll du domaine d'application actuel. Lorsque l'application charge dll (application MVC4) cette fois-ci, une erreur se produit car maproute actuelle ajoute déjà la clé pour "HelpPage_Default".

Solution. 1.Changez la clé pour RegisterArea dans maproute soit l'application actuelle, soit l'application existante (reportez-vous à la dll). 2.Déplacez le code dll (application mvc4) vers une bibliothèque différente et reportez-vous à la nouvelle dll.

Raj Kishor Gupta
la source
0

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

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

J'avais une application qui était une application Forms migrée vers MVC avec un composant tiers utilisé pour l'authentification qui redirigeait 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 au site et une fois pour le retour). J'ai donc résolu cela 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}
                    );
            }

done_merson
la source
0

La suppression des dll dans le dossier bin fonctionnait à 100%, j'avais encore des dll que mon projet avait besoin de reconstruire. Faites plutôt une copie du dossier bin. puis supprimez l'original. reconstruisez le projet. en cas d'échec, placez les DLL manquantes dans le dossier bin.

Terry Mosoma
la source
0

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

Phate01
la source
0

Lors de la publication sur un Azure App Service, je devais vérifier les "Paramètres" de la boîte de dialogue de publication -> "Options de publication de fichiers" -> "Supprimer les fichiers supplémentaires à destination" pour supprimer l'ancienne DLL du projet et les fichiers de symboles. Ensuite, le site se chargerait.

Il s'agit essentiellement de la solution actuelle des réponses (Fleas). Supprimez la DLL incriminée.

Ce qui a provoqué la conservation de cette ancienne DLL, c'est que je chargeais une version plus ancienne du site Web (modèles MVC 3 ~ 5 mais un projet Web différent avec des espaces de noms en collision, car la version la plus récente était une copie de ce projet dans un passé récent. ) Les DLL du projet plus récent avaient juste besoin d'être supprimées. Il existe différentes manières d'y parvenir. J'ai trouvé que l'utilisation d'une boîte de dialogue était le guichet automatique le plus simple. La connexion au système de fichiers et la suppression manuelle des fichiers fonctionnent certainement aussi.

Hunter-Orionnoir
la source