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 }
);
}
}
Antworten:
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.
quelle
bin
Ordner.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:
Die folgende Zeile kommt bei dieser Methode zweimal vor:
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:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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 ...
quelle
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.
quelle
Versuchen Sie diesen Code, ändern Sie nur den Namen
quelle
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.
quelle
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.quelle
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:
quelle
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.
quelle
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
quelle
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.
quelle