Una ruta denominada "x" ya está en la colección de rutas. Los nombres de las rutas deben ser únicos. Excepción con ASP.NET MVC 3

98

Estoy haciendo un servicio web ASP.NET MVC 3 y sigo recibiendo esta excepción de forma intermitente.

Seguimiento de pila:

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

Probablemente esté relacionado con el hecho de que Route Debugger muestra que tengo algunas rutas antiguas que modifiqué o eliminé y que no desaparecerán (incluso después de reiniciar mi máquina). El seguimiento de la pila también se refiere a un archivo de origen que se eliminó hace mucho tiempo y mi aplicación se movió a una nueva ubicación, se limpió y se reconstruyó desde entonces. ¿Qué me estoy perdiendo?

Aquí está todo mi código de registro de ruta:

// 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
fuente
¿Tienes otro lugar que definiste rutas? Áreas
Shyju
Agregué el seguimiento de la pila y agregué información adicional sobre mis rutas.
Rn222

Respuestas:

297

Para solucionar este problema, tuve que ir a la carpeta bin de mi proyecto, eliminar todos los archivos DLL y luego reconstruir y esto solucionó el problema.

Pulga
fuente
11
Simplemente limpiando la solución hacemos lo mismo.
Fabio Milheiro
84
@Bomboca: la limpieza no elimina las DLL que no forman parte del proyecto. Por ejemplo, si cambia el nombre del ensamblado de su proyecto, el ensamblado anterior permanecerá en la bincarpeta.
Josh M.
2
Estaba experimentando el mismo problema y esto resolvió mi problema de inmediato. ¡Gracias!
Aluan Haddad
1
Cambié el nombre de mi proyecto y la vieja DLL todavía estaba en la carpeta bin. Por favor, gente: solución permanente, al PUBLICAR, primero elimine todos los archivos en el directorio de destino. (opción al publicar en directorio)
StijnSpijker
2
No sé por qué, pero la "solución limpia" no me funciona. Tu solución funciona.
user2980426
19

Este error puede ocurrir por múltiples causas, tuve el mismo error y lo resolví modificando la clase Global.asax.

El método Application_Start en Global.asax.cs era como:

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

La siguiente línea aparece dos veces en este método:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Esto aseguró que la ruta se agregara dos veces a la lista de rutas y al mismo tiempo causara el error.

Cambié el método Application_Start de la siguiente manera y el error desapareció:

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

Puede que esta no sea la respuesta a su problema, pero quizás pueda ayudar a otros en el futuro. No vi esta respuesta entre los demás, así que decidí agregar esto.

Max
fuente
2
También hay una llamada duplicada a AreaRegistration.RegisterAllAreas ().
Spivonious
Además, me encontré con esto: WebApiConfig.Register (GlobalConfiguration.Configuration); con GlobalConfiguration.Configure (WebApiConfig.Register); ambos llaman al mismo método en WebApiConfig.cs. El truco es, por supuesto, poner un descanso donde se establece el nombre de la ruta y mirar la pila de llamadas.
Reid
Recibí este error y ninguna de las otras soluciones me funcionó, pero luego encontré un AreaRegistration.RegisterAllAreas () duplicado; líneas en mi archivo global.asax. Eliminar uno de ellos eliminó el error.
ewomack
10

Descubrí que Global.asax se refería a una versión anterior del archivo DLL del sitio antes de cambiarle el nombre. La DLL no se estaba limpiando cuando hice Build> Clean up porque el proyecto / solución VS ya no se refería a ella. Parece que a veces solo se usaba la versión más nueva de la DLL, lo que permitía que el sitio funcionara correctamente, pero eventualmente ambos se cargarían y provocarían conflictos de ruta.

Rn222
fuente
eliminar bin y obj funcionó para mí después de cambiar el nombre de mi proyecto.
Steve
3
¿Cómo averiguó que Global.asax se refería a un archivo DLL antiguo?
xaisoft
@xiasoft: el archivo DLL antiguo contenía rutas que había eliminado, pero Route Debugger mostró que todavía estaban allí. Cuando eliminé el archivo DLL antiguo, también se eliminaron las rutas antiguas.
Rn222
4

Las rutas se cargan desde todos los ensamblados dentro de AppDomain.CurrentDomain, por lo que si sus ensamblajes antiguos todavía son parte de eso, es posible que aún obtenga rutas antiguas / duplicadas.

Filip W
fuente
3
¿Cómo puedo comprobar si este es el problema?
Rn222
Así es. Ocurrió en mi proyecto. Cuando cambié su nombre, ocurrió este error. Después de quitar el ensamblaje antiguo, el error desapareció.
bafsar
3

En mi caso, me enfrenté a este problema, cuando agregué una referencia a otro proyecto de la solución, que también era MVC y usé los mismos nombres en el área (no quería agregar este proyecto, no sé cómo sucedió ). Cuando eliminé esta DLL, el proyecto comenzó a funcionar.

Soñar con algo malo
fuente
Ni siquiera se me había ocurrido que esto pudiera suceder, ya que siempre he mantenido los proyectos de mi sitio autocontenidos en lugar de dividir las cosas en una docena de piezas "porque la arquitectura". Nuevo equipo, nuevas convenciones, nuevas oportunidades de internalizar algunas de las opciones que aún no me habían resultado útiles.
brichins
2

Eliminar las DLL por sí solo no funcionó para mí (en VS2013), pero eliminar todas las carpetas 'bin' y 'obj' y luego crear la solución funcionó perfectamente. Me hace desear no haber pasado tanto tiempo tratando de arreglarlo ...

Lyall
fuente
1

Ninguna de las sugerencias funcionó para mí. Avancé y reinicié el servidor web (IIS en este caso) y eso borró el error después de haber arreglado el código. DLL debe haberse almacenado en caché en IIS.

joel1618
fuente
1

prueba este código, solo cambia el nombre

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
fuente
0

Recibo el mismo error. Pero finalmente tengo la solución. Escenario: estoy agregando diferentes dll (aplicación mvc4) en mi aplicación web api mvc4. Cuando intente correr. Recibo el mismo error. Causa raíz: cuando mi aplicación web api se ejecuta .Application registra todas las áreas desde uno mismo y comienza a cargarse en las referencias dll del dominio de la aplicación actual. Cuando la aplicación carga la dll (aplicación MVC4), ese tiempo obtiene un error porque la ruta actual ya agrega la clave para "HelpPage_Default".

Solución. 1.Cambie la clave para RegisterArea en maproute, ya sea la aplicación actual o la aplicación existente (Consulte dll). 2.Mueva el código dll (aplicación mvc4) a otro liberary y consulte el nuevo dll.

Raj Kishor Gupta
fuente
0

Estaba llamando manualmente AttributeRoutingHttpConfig.Start()a mi Global.asax. No noté esta línea generada automáticamente en la parte superior del archivo que lo llama automáticamente.

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

Tenía una aplicación que era una aplicación de formularios migrada a MVC con un componente de terceros utilizado para la autenticación que redirigía a otro sitio. El componente iniciaría una sesión dos veces si el usuario aún no había iniciado sesión (una vez para la conexión inicial al sitio y otra para regresar). Así que resolví esto con el siguiente código:

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
fuente
0

Eliminar los dlls en la carpeta bin funcionó al 100%, todavía tenía dlls que mi proyecto necesitaba reconstruir. Más bien haga una copia de la carpeta bin. luego borre el original y reconstruya el proyecto. si falla, coloque los archivos DLL que faltan en la carpeta bin.

Terry Mosoma
fuente
0

Estaba ejecutando un sitio web antiguo de MVC2 y tuve este problema porque el 'Modo de canalización administrado' de IIS estaba configurado en 'Integrado' de forma predeterminada (presione F4 en el proyecto). Cambiarlo a 'Clásico' solucionó el problema

Phate01
fuente
0

Al publicar en un servicio de aplicaciones de Azure, tuve que verificar la "Configuración" del cuadro de diálogo Publicar -> "Opciones de publicación de archivos" -> "Eliminar archivos adicionales en el destino" para eliminar la DLL del proyecto anterior y los archivos de símbolos. Entonces se cargaría el sitio.

Esta es esencialmente la solución de respuestas actuales (Fleas) en el núcleo. Elimine la DLL infractora.

Lo que causó que se conservara esta vieja DLL fue que estaba cargando una versión anterior del sitio web (plantillas MVC 3 ~ 5 pero un proyecto web diferente con espacios de nombres en colisión, ya que la versión más reciente era una copia de este proyecto que se hizo en algún momento en el pasado reciente. ) Las DLL del proyecto más reciente solo necesitaban ser eliminadas. Hay varias formas de lograrlo. Descubrí que usar un diálogo es el cajero automático más fácil. Iniciar sesión en el sistema de archivos y eliminar los archivos manualmente también funciona.

Cazador-Orionnoir
fuente