Una rotta denominata "x" è già nella raccolta di rotte. I nomi delle rotte devono essere univoci. Eccezione con ASP.NET MVC 3


98

Sto eseguendo un servizio Web ASP.NET MVC 3 e continuo a ricevere questa eccezione in modo intermittente.

Traccia dello stack:

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

Probabilmente è legato al fatto che Route Debugger mostra che ho alcune vecchie rotte che ho modificato o cancellato e che non andranno via (anche dopo aver riavviato la mia macchina). La traccia dello stack si riferisce anche a un file sorgente che è stato eliminato da tempo e la mia app è stata spostata in una nuova posizione, pulita e ricostruita da allora. Cosa mi sto perdendo?

Ecco tutto il mio codice di registrazione del percorso:

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

    }
}

Hai un altro posto che hai definito percorsi? Le zone ?
Shyju,

Ho aggiunto la traccia dello stack e ho aggiunto ulteriori informazioni sui miei percorsi.
Rn222,

Risposte:


297

Per risolvere questo problema ho dovuto andare nella cartella bin del mio progetto, eliminare tutti i file DLL e quindi ricostruire e questo ha risolto il problema.


11
Semplicemente pulendo la soluzione facciamo la stessa cosa.
Fabio Milheiro

84
@Bomboca - la pulizia non elimina le DLL che non fanno parte del progetto. Ad esempio, se hai cambiato il nome dell'assembly del tuo progetto, il vecchio assembly rimarrebbe nella bincartella.
Josh M.

2
Stavo riscontrando lo stesso problema e questo ha risolto immediatamente il mio problema. Grazie!
Aluan Haddad,

1
Ho rinominato il mio progetto e la vecchia DLL era ancora nella cartella bin. Per favore gente: soluzione permanente, durante la PUBBLICAZIONE, elimina prima tutti i file nella directory di destinazione! (opzione durante la pubblicazione nella directory)
StijnSpijker

2
Non so perché, ma "Soluzione pulita" non funziona per me. La tua soluzione funziona.
user2980426

19

Questo errore può verificarsi a causa di più cause, ho avuto lo stesso errore e l'ho risolto modificando la classe Global.asax.

Il metodo Application_Start su Global.asax.cs era come:

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

La riga seguente si verifica due volte in questo metodo:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Ciò ha garantito che la rotta fosse aggiunta due volte all'elenco delle rotte e allo stesso tempo causasse l'errore.

Ho cambiato il metodo Application_Start come segue e l'errore è scomparso:

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

Questa potrebbe non essere la risposta al tuo problema, ma forse può aiutare gli altri in futuro. Non ho visto questa risposta tra le altre, quindi ho deciso di aggiungerla.


2
C'è anche una chiamata duplicata ad AreaRegistration.RegisterAllAreas ().
Spivonious

Inoltre, mi sono imbattuto in questo: WebApiConfig.Register (GlobalConfiguration.Configuration); con GlobalConfiguration.Configure (WebApiConfig.Register); entrambi chiamano lo stesso metodo in WebApiConfig.cs. Il trucco è ovviamente quello di mettere una pausa nel punto in cui viene impostato il nome della rotta e guardare lo stack di chiamate.
Reid

Ricevo questo errore e nessuna delle altre soluzioni ha funzionato per me, ma poi ho trovato AreaRegistration.RegisterAllAreas () duplicata; righe nel mio file global.asax. La rimozione di uno di essi ha rimosso l'errore.
ewomack

10

Ho scoperto che Global.asax si riferiva a una vecchia versione del file DLL del sito prima di rinominarlo. La DLL non veniva ripulita quando ho fatto Build> Clean up perché il progetto / soluzione VS non vi faceva più riferimento. Sembra che a volte sia stata utilizzata solo la versione più recente della DLL, consentendo al sito di funzionare correttamente, ma alla fine sarebbero stati caricati entrambi causando conflitti di route.


l'eliminazione di bin e obj ha funzionato per me dopo aver rinominato il mio progetto.
Steve

3
Come hai scoperto che Global.asax si riferiva a una vecchia DLL?
xaisoft

@xiasoft: la vecchia DLL conteneva rotte che avevo cancellato ma Route Debugger mostrava che erano ancora lì. Quando ho cancellato la vecchia DLL, sono stati rimossi anche i vecchi percorsi.
Rn222

4

Le rotte vengono caricate da tutti gli assembly all'interno di AppDomain.CurrentDomain, quindi se i tuoi vecchi assembly ne fanno ancora parte, potresti ancora ricevere rotte vecchie / duplicate.


3
Come posso verificare se questo è il problema?
Rn222,

Giusto. È successo nel mio progetto. Quando ho cambiato il nome, si è verificato questo errore. Dopo aver rimosso il vecchio assembly, l'errore è scomparso.
bafsar

3

Nel mio caso, ho affrontato questo problema, quando ho aggiunto il riferimento a un altro progetto dalla soluzione, che era anche MVC e ho utilizzato gli stessi nomi in area (non volevo aggiungere questo progetto, non so come sia successo ). Quando ho rimosso questa DLL, il progetto ha iniziato a funzionare.


Non mi era nemmeno venuto in mente che questo potesse accadere, dato che ho sempre mantenuto i progetti del mio sito autonomi invece di dividere le cose in una dozzina di pezzi "perché architettura". Nuovo team, nuove convenzioni, nuove possibilità di interiorizzare alcune delle opzioni che non avevo ancora trovato utili.
brichins

2

L'eliminazione delle DLL da sola non ha funzionato per me (in VS2013), ma l'eliminazione dell'intera cartella "bin" e "obj" e quindi la creazione della soluzione ha funzionato perfettamente! Mi fa desiderare di non aver passato così tanto tempo a cercare di risolverlo ...


1

Nessuno dei suggerimenti ha funzionato per me. Sono andato avanti e ho riavviato il server web (IIS in questo caso) e questo ha cancellato l'errore dopo aver corretto il codice. La DLL deve essere stata memorizzata nella cache in IIS.


1

prova questo codice, cambia solo nome

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

Ricevo lo stesso errore. Ma finalmente ho una soluzione. Scenario: sto aggiungendo una dll diversa (applicazione mvc4) nella mia applicazione web api mvc4. Quando prova a correre. Ricevo lo stesso errore. Causa principale: quando la mia applicazione web api viene eseguita .Application registra tutta l'area da sé e inizia a caricare i riferimenti dll del dominio dell'applicazione corrente. Quando l'applicazione carica dll (applicazione MVC4) quella volta riceve un errore perché il maproute corrente aggiunge già la chiave per "HelpPage_Default".

Soluzione. 1.Cambia la chiave per RegisterArea in maproute sia nell'applicazione corrente che nell'applicazione esistente (Fare riferimento a dll). 2. Sposta il codice dll (applicazione mvc4) in un diverso liberary e fai riferimento al nuovo dll.


0

Stavo chiamando manualmente il AttributeRoutingHttpConfig.Start()mio Global.asax. Non ho notato questa riga generata automaticamente all'inizio del file che la chiama automaticamente.

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

0

Avevo un'applicazione che era un'app Forms migrata a MVC con un componente di terze parti utilizzato per l'autenticazione che reindirizzava a un altro sito. Il componente avviava una sessione due volte se l'utente non era già connesso (una per la connessione iniziale al sito e una per il ritorno). Quindi ho risolto questo con il seguente codice:

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

L'eliminazione delle DLL nella cartella bin ha funzionato al 100%, avevo ancora le DLL necessarie per la ricostruzione del mio progetto. Piuttosto fai una copia della cartella bin. quindi eliminare l'originale. ricostruire il progetto. se fallisce, inserisci le DLL mancanti nella cartella bin.


0

Stavo eseguendo un vecchio sito Web MVC2 e ho riscontrato questo problema perché la "Modalità pipeline gestita" di IIS era impostata su "Integrata" per impostazione predefinita (premere F4 sul progetto). Cambiarlo in "Classico" ha risolto il problema


0

Durante la pubblicazione in un servizio app di Azure, ho dovuto controllare le "Impostazioni" della finestra di dialogo Pubblica -> "Opzioni di pubblicazione dei file" -> "Rimuovi file aggiuntivi a destinazione" per rimuovere la vecchia DLL del progetto e i file dei simboli. Quindi il sito verrà caricato.

Questa è essenzialmente la soluzione delle risposte attuali (di Fleas) al centro. Elimina la DLL incriminata.

Ciò che ha causato il mantenimento di questa vecchia DLL è stato il caricamento di una versione precedente del sito Web (modelli MVC 3 ~ 5 ma progetto Web diverso con spazi dei nomi in conflitto, poiché la versione più recente era una copia di questo progetto che ha avuto un certo punto nel recente passato. ) Le DLL del progetto più recente dovevano solo essere eliminate. Ci sono vari modi per ottenere questo risultato. Ho scoperto che l'utilizzo di una finestra di dialogo è il bancomat più semplice. Anche l'accesso al file system e l'archiviazione manuale dei file funzionano sicuramente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.