Eine Route mit dem Namen "x" befindet sich bereits in der Routensammlung. Routennamen müssen eindeutig sein. Ausnahme mit ASP.NET MVC 3

98

Ich mache einen ASP.NET MVC 3-Webdienst und erhalte diese Ausnahme immer wieder.

Stapelspur:

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

Es hängt wahrscheinlich damit zusammen, dass Route Debugger anzeigt, dass ich einige alte Routen habe, die ich geändert oder gelöscht habe und die nicht verschwinden (auch nach dem Neustart meines Computers). Der Stack-Trace bezieht sich auch auf eine Quelldatei, die längst gelöscht wurde und meine App seitdem an einen neuen Speicherort verschoben, bereinigt und neu erstellt wurde. Was vermisse ich?

Hier ist mein ganzer Routenregistrierungscode:

// 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
quelle
Haben Sie einen anderen Ort, an dem Sie Routen definiert haben? Bereiche ?
Shyju
Ich habe den Stack-Trace hinzugefügt und zusätzliche Informationen zu meinen Routen hinzugefügt.
Rn222

Antworten:

297

Um dieses Problem zu beheben, musste ich in den Ordner bin in meinem Projekt gehen, alle DLL-Dateien löschen und dann neu erstellen. Dadurch wurde das Problem behoben.

Floh
quelle
11
Durch einfaches Reinigen der Lösung machen wir dasselbe.
Fabio Milheiro
84
@Bomboca - Beim Reinigen werden keine DLLs gelöscht, die nicht Teil des Projekts sind. Wenn Sie beispielsweise den Baugruppennamen Ihres Projekts ändern, bleibt die alte Baugruppe im binOrdner.
Josh M.
2
Ich hatte das gleiche Problem und dies löste mein Problem sofort. Danke dir!
Aluan Haddad
1
Mein Projekt wurde umbenannt und die alte DLL befand sich noch im Ordner bin. Bitte Leute: dauerhafte Lösung, beim VERÖFFENTLICHEN, löschen Sie zuerst alle Dateien im Zielverzeichnis! (Option beim Veröffentlichen im Verzeichnis)
StijnSpijker
2
Ich weiß nicht warum, aber "Saubere Lösung" funktioniert bei mir nicht. Ihre Lösung funktioniert.
user2980426
19

Dieser Fehler kann aus mehreren Gründen auftreten. Ich hatte denselben Fehler und habe ihn durch Ändern der Global.asax-Klasse behoben.

Die Application_Start-Methode in Global.asax.cs war wie folgt:

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

Die folgende Zeile kommt bei dieser Methode zweimal vor:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Dadurch wurde sichergestellt, dass die Route zweimal zur Routenliste hinzugefügt wurde und gleichzeitig den Fehler verursachte.

Ich habe die Application_Start-Methode wie folgt geändert und der Fehler ist verschwunden:

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

Dies ist möglicherweise nicht die Antwort auf Ihr Problem, kann aber möglicherweise in Zukunft anderen helfen. Ich habe diese Antwort zwischen den anderen nicht gesehen, also habe ich beschlossen, sie hinzuzufügen.

Max
quelle
2
Es gibt auch einen doppelten Aufruf von AreaRegistration.RegisterAllAreas ().
Spivonious
Außerdem bin ich auf Folgendes gestoßen: WebApiConfig.Register (GlobalConfiguration.Configuration); mit GlobalConfiguration.Configure (WebApiConfig.Register); beide rufen dieselbe Methode in WebApiConfig.cs auf. Der Trick besteht natürlich darin, eine Pause einzulegen, in der der Routenname festgelegt wird, und den Aufrufstapel zu überprüfen.
Reid
Ich habe diesen Fehler erhalten und keine der anderen Lösungen hat für mich funktioniert, aber dann habe ich ein doppeltes AreaRegistration.RegisterAllAreas () gefunden. Zeilen in meiner global.asax-Datei. Durch Entfernen eines davon wurde der Fehler behoben.
Ewomack
10

Ich fand heraus, dass Global.asax auf eine alte Version der DLL-Datei der Site verweist, bevor ich sie umbenannte. Die DLL wurde beim Erstellen> Bereinigen nicht bereinigt, da das VS-Projekt / die VS-Lösung nicht mehr darauf verwies. Es scheint, dass manchmal nur die neuere Version der DLL verwendet wurde, sodass die Site ordnungsgemäß funktioniert, aber schließlich wurden beide geladen, was zu Routenkonflikten führte.

Rn222
quelle
Das Löschen von bin und obj hat bei mir funktioniert, nachdem ich mein Projekt umbenannt habe.
Steve
3
Wie haben Sie herausgefunden, dass sich Global.asax auf eine alte DLL bezieht?
Xaisoft
@xiasoft: Die alte DLL enthielt Routen, die ich gelöscht hatte, aber Route Debugger zeigte, dass sie noch vorhanden waren. Als ich die alte DLL löschte, wurden auch die alten Routen entfernt.
Rn222
4

Die Routen werden von allen Assemblys in AppDomain.CurrentDomain geladen. Wenn Ihre alten Assemblys also noch Teil davon sind, erhalten Sie möglicherweise immer noch alte / doppelte Routen.

Filip W.
quelle
3
Wie kann ich überprüfen, ob dies das Problem ist?
Rn222
Das stimmt. Es passierte bei meinem Projekt. Als ich den Namen änderte, trat dieser Fehler auf. Nach dem Entfernen der alten Baugruppe ist der Fehler behoben.
Bafsar
3

In meinem Fall war ich mit diesem Problem konfrontiert, als ich einen Verweis auf ein anderes Projekt aus der Lösung hinzufügte, bei dem es sich ebenfalls um MVC handelte, und im Bereich dieselben Namen verwendete (ich wollte dieses Projekt nicht hinzufügen, ich weiß nicht, wie es passiert ist ). Als ich diese DLL entfernte, begann das Projekt zu funktionieren.

Träum böse
quelle
Mir war noch nicht einmal in den Sinn gekommen, dass dies passieren könnte, da ich meine Site-Projekte immer in sich geschlossen hielt, anstatt die Dinge "wegen der Architektur" in ein Dutzend Teile aufzuteilen. Neues Team, neue Konventionen, neue Möglichkeiten, einige der Optionen zu verinnerlichen, die ich noch nicht für nützlich befunden hatte.
Brichins
2

Das Löschen der DLLs allein hat bei mir nicht funktioniert (in VS2013), aber das Löschen der gesamten Ordner 'bin' und 'obj' und das anschließende Erstellen der Lösung hat perfekt funktioniert! Ich wünschte, ich hätte nicht so lange versucht, das Problem zu beheben ...

Lyall
quelle
1

Keiner der Vorschläge hat bei mir funktioniert. Ging voran und startete den Webserver neu (in diesem Fall IIS) und das löschte den Fehler, nachdem ich den Code behoben hatte. Die DLL muss in IIS zwischengespeichert worden sein.

joel1618
quelle
1

Versuchen Sie diesen Code, ändern Sie nur den Namen

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

Ich erhalte den gleichen Fehler. Aber endlich habe ich eine Lösung. Szenario: Ich füge meiner Web-API-MVC4-Anwendung eine andere DLL (MVC4-Anwendung) hinzu. Beim Versuch zu rennen. Ich erhalte den gleichen Fehler. Grundursache - Wenn meine Web-API-Anwendung ausgeführt wird .Anwendung registriert alle Bereiche von sich selbst und beginnt mit dem Laden in die aktuellen DLL-Referenzen der Anwendungsdomäne. Wenn die Anwendung die DLL (MVC4-Anwendung) lädt, wird diesmal ein Fehler angezeigt, da die aktuelle Maproute bereits den Schlüssel für "HelpPage_Default" hinzufügt.

Lösung. 1. Ändern Sie den Schlüssel für RegisterArea in Maproute entweder in der aktuellen Anwendung oder in der vorhandenen Anwendung (siehe DLL). 2. Verschieben Sie den Code-DLL-Code (MVC4-Anwendung) in einen anderen liberalen Code und verweisen Sie auf die neue DLL.

Raj Kishor Gupta
quelle
0

Ich habe AttributeRoutingHttpConfig.Start()meine Global.asax manuell aufgerufen. Ich habe diese automatisch generierte Zeile oben in der Datei nicht bemerkt, die sie automatisch aufruft.

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

Ich hatte eine Anwendung, bei der es sich um eine auf MVC migrierte Forms-App mit einer zur Authentifizierung verwendeten Drittanbieter-Komponente handelte, die auf eine andere Site umgeleitet wurde. Die Komponente würde eine Sitzung zweimal starten, wenn der Benutzer nicht bereits angemeldet wäre (einmal für die erste Verbindung zur Site und einmal für die Rückgabe). Also habe ich das mit folgendem Code gelöst:

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

Das Löschen der DLLs im Ordner bin funktionierte zu 100%. Ich hatte immer noch DLLs, die mein Projekt neu erstellen musste. Erstellen Sie lieber eine Kopie des Ordners bin. Löschen Sie dann das Original. Erstellen Sie das Projekt neu. Wenn dies fehlschlägt, legen Sie die fehlenden DLLs im Ordner bin ab.

Terry Mosoma
quelle
0

Ich habe eine alte MVC2-Website ausgeführt und dieses Problem erhalten, weil der IIS-Modus "Verwalteter Pipeline" standardmäßig auf "Integriert" eingestellt war (drücken Sie im Projekt F4). Durch Ändern in "Klassisch" wurde das Problem behoben

Phate01
quelle
0

Beim Veröffentlichen in einem Azure App-Dienst musste ich die "Einstellungen" des Dialogfelds "Veröffentlichen" -> "Veröffentlichungsoptionen für Dateien" -> "Zusätzliche Dateien am Zielort entfernen" überprüfen, um die alte Projekt-DLL und die Symboldateien zu entfernen. Dann würde die Site geladen.

Dies ist im Wesentlichen die aktuelle Antwortlösung (Fleas) im Kern. Löschen Sie die fehlerhafte DLL.

Was dazu führte, dass diese alte DLL beibehalten wurde, war, dass ich eine ältere Version der Website lud (MVC 3 ~ 5-Vorlagen, aber ein anderes Webprojekt mit kollidierenden Namespaces), da die neuere Version eine Kopie dieses Projekts war, die in der jüngeren Vergangenheit irgendwann erwähnt wurde. ) Die DLLs des neueren Projekts mussten nur gelöscht werden. Es gibt verschiedene Möglichkeiten, dies zu erreichen. Ich fand es am einfachsten, einen Dialog zu benutzen. Das Einloggen in das Dateisystem und das Löschen der Dateien von Hand funktioniert sicherlich auch.

Hunter-Orionnoir
quelle