Robię usługę sieci Web ASP.NET MVC 3 i sporadycznie otrzymuję ten wyjątek.
Ślad stosu:
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
Jest to prawdopodobnie związane z faktem, że Route Debugger pokazuje, że mam kilka starych tras, które zmodyfikowałem lub usunąłem i nie znikną (nawet po ponownym uruchomieniu komputera). Ślad stosu odnosi się również do pliku źródłowego, który został dawno usunięty, a moja aplikacja została przeniesiona do nowej lokalizacji, od tego czasu wyczyszczona i odbudowana. czego mi brakuje?
Oto cały mój kod rejestracyjny trasy:
// 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 }
);
}
}
Odpowiedzi:
Aby rozwiązać ten problem, musiałem przejść do folderu bin w moim projekcie, usunąć wszystkie pliki DLL, a następnie odbudować i to rozwiązało problem.
źródło
bin
folderze.Ten błąd może wystąpić z wielu przyczyn, miałem ten sam błąd i rozwiązałem go, modyfikując klasę Global.asax.
Metoda Application_Start w Global.asax.cs wyglądała tak:
Poniższy wiersz występuje dwukrotnie w tej metodzie:
Dzięki temu trasa została dwukrotnie dodana do listy tras, powodując jednocześnie błąd.
Zmieniłem metodę Application_Start w następujący sposób i błąd zniknął:
To może nie być odpowiedzią na twój problem, ale być może pomoże innym w przyszłości. Nie widziałem tej odpowiedzi między innymi, więc postanowiłem to dodać.
źródło
Dowiedziałem się, że Global.asax odnosił się do starej wersji pliku DLL witryny, zanim zmieniłem jego nazwę. Biblioteka DLL nie była czyszczona, gdy robiłem Kompiluj> Oczyść, ponieważ projekt / rozwiązanie VS nie odwoływało się już do niej. Wygląda na to, że czasami używana była tylko nowsza wersja biblioteki DLL, co umożliwiło poprawne działanie witryny, ale ostatecznie oba z nich zostałyby załadowane, powodując konflikty tras.
źródło
Trasy są ładowane ze wszystkich zestawów w ramach AppDomain.CurrentDomain, więc jeśli stare zestawy są nadal częścią tego, nadal możesz uzyskać stare / zduplikowane trasy.
źródło
W moim przypadku spotkałem się z tym problemem, kiedy dodałem odniesienie do innego projektu z rozwiązania, które również było MVC i używam tych samych nazw w obszarze (nie chciałem dodawać tego projektu, nie wiem jak to się stało ). Kiedy usunąłem tę bibliotekę DLL, projekt zaczął działać.
źródło
Usunięcie samych bibliotek DLL nie zadziałało (w VS2013), ale usunięcie całego folderu „bin” i „obj”, a następnie zbudowanie rozwiązania działało idealnie! Żałuję, że nie spędziłem tak dużo czasu, próbując to naprawić ...
źródło
Żadna z sugestii nie zadziałała dla mnie. Poszedłem dalej i zrestartowałem serwer sieciowy (w tym przypadku IIS) i to usunęło błąd po naprawieniu kodu. Biblioteka DLL musi być buforowana w usługach IIS.
źródło
spróbuj tego kodu, zmień tylko nazwę
źródło
Otrzymuję ten sam błąd. Ale w końcu mam rozwiązanie. Scenariusz: dodaję inną bibliotekę dll (aplikacja mvc4) do aplikacji mvc4 interfejsu API sieci web. Kiedy próbujesz uciekać. Otrzymuję ten sam błąd. Główna przyczyna - kiedy moja aplikacja webowa działa .Aplikacja rejestruje cały obszar od siebie i rozpoczyna ładowanie do bieżących odniesień do biblioteki DLL domeny aplikacji. Gdy aplikacja ładuje bibliotekę dll (aplikacja MVC4), pojawia się błąd, ponieważ bieżąca maproute już dodaje klucz do „HelpPage_Default”.
Rozwiązanie. 1. Zmień klucz dla RegisterArea w maproute albo w bieżącej aplikacji, albo w istniejącej aplikacji (patrz dll). 2. Przenieś kod dll (aplikacja mvc4) na inny liberary i odwołaj się do nowej biblioteki dll.
źródło
AttributeRoutingHttpConfig.Start()
Dzwoniłem ręcznie w moim Global.asax. Nie zauważyłem tej automatycznie wygenerowanej linii na górze pliku, która automatycznie ją wywołuje.źródło
Miałem aplikację, która była aplikacją Forms, zmigrowaną do MVC z komponentem innej firmy używanym do uwierzytelniania, który przekierował do innej witryny. Komponent uruchomiłby sesję dwukrotnie, gdyby użytkownik nie był jeszcze zalogowany (raz w celu nawiązania połączenia z witryną i raz w celu powrotu). Więc rozwiązałem to za pomocą następującego kodu:
źródło
Usunięcie bibliotek dll w folderze bin działało w 100%, nadal miałem biblioteki dll, które mój projekt wymagał odbudowania. Zamiast tego wykonaj kopię folderu bin. następnie usuń oryginał. odbuduj projekt. jeśli to się nie powiedzie, umieść brakujące biblioteki DLL w folderze bin.
źródło
Używałem starej witryny MVC2 i otrzymałem ten problem, ponieważ tryb „Managed Pipeline” usług IIS był domyślnie ustawiony na „Zintegrowany” (naciśnij klawisz F4 w projekcie). Zmiana na „Klasyczną” rozwiązała problem
źródło
Podczas publikowania w usłudze Azure App Service musiałem sprawdzić w oknie dialogowym publikowania „Ustawienia” -> „Opcje publikowania plików” -> „Usuń dodatkowe pliki w miejscu docelowym”, aby usunąć starą bibliotekę DLL projektu i pliki symboli. Wtedy strona się załaduje.
W istocie jest to obecne rozwiązanie odpowiedzi (Fleas) u podstaw. Usuń problematyczną bibliotekę DLL.
To, co spowodowało, że ta stara biblioteka DLL została zachowana, to ładowanie starszej wersji strony internetowej (szablony MVC 3 ~ 5, ale inny projekt sieciowy z kolidującymi przestrzeniami nazw, ponieważ nowsza wersja była kopią tego projektu, która miała miejsce w niedawnej przeszłości. ) Po prostu trzeba było usunąć biblioteki DLL nowszego projektu. Można to osiągnąć na różne sposoby. Zauważyłem, że najłatwiejszym bankomatem jest okno dialogowe. Logowanie do systemu plików i ręczne kopiowanie plików z pewnością też działa.
źródło