Trasa o nazwie „x” jest już w kolekcji tras. Nazwy tras muszą być unikalne. Wyjątek z ASP.NET MVC 3

98

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

    }
}
Rn222
źródło
Czy masz inne miejsce, w którym zdefiniowałeś trasy? Obszary?
Shyju,
Dodałem ślad stosu i dodatkowe informacje o moich trasach.
Rn222

Odpowiedzi:

297

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.

Pchła
źródło
11
Po prostu czyszcząc roztwór, robimy to samo.
Fabio Milheiro
84
@Bomboca - czyszczenie nie usuwa bibliotek DLL, które nie są częścią projektu. Np. Jeśli zmienisz nazwę zespołu projektu, stary zespół pozostanie w binfolderze.
Josh M.
2
Miałem ten sam problem i to natychmiast rozwiązało mój problem. Dziękuję Ci!
Aluan Haddad
1
Zmieniono nazwę mojego projektu, a stara biblioteka DLL nadal znajdowała się w folderze bin. Proszę ludzie: trwałe rozwiązanie, kiedy PUBLIKUJEMY, usuń najpierw wszystkie pliki z katalogu docelowego! (opcja przy publikacji w katalogu)
StijnSpijker
2
Nie wiem dlaczego, ale „Czyste rozwiązanie” nie działa dla mnie. Twoje rozwiązanie działa.
user2980426
19

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:

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

Poniższy wiersz występuje dwukrotnie w tej metodzie:

RouteConfig.RegisterRoutes(RouteTable.Routes);

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ął:

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

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ć.

Maks
źródło
2
Istnieje również zduplikowane wywołanie AreaRegistration.RegisterAllAreas ().
Spivonious
Również natknąłem się na to: WebApiConfig.Register (GlobalConfiguration.Configuration); z GlobalConfiguration.Configure (WebApiConfig.Register); oba wywołują tę samą metodę w WebApiConfig.cs. Sztuczka polega oczywiście na umieszczeniu przerwy w ustawianiu nazwy trasy i spojrzeniu na stos wywołań.
Reid
Otrzymałem ten błąd i żadne inne rozwiązanie nie działało, ale potem znalazłem duplicate AreaRegistration.RegisterAllAreas (); wiersze w moim pliku global.asax. Usunięcie jednego z nich usunęło błąd.
ewomack
10

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.

Rn222
źródło
usunięcie bin i obj zadziałało po zmianie nazwy mojego projektu.
Steve,
3
Jak dowiedziałeś się, że Global.asax odnosi się do starej biblioteki DLL?
xaisoft
@xiasoft: Stara biblioteka DLL zawierała trasy, które usunąłem, ale Route Debugger pokazał, że nadal tam są. Po usunięciu starej biblioteki DLL stare trasy również zostały usunięte.
Rn222
4

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.

Filip W.
źródło
3
Jak mogę sprawdzić, czy to jest problem?
Rn222
Zgadza się. Stało się to w przypadku mojego projektu. Kiedy zmieniłem jego nazwę, wystąpił ten błąd. Po usunięciu starego zespołu błąd zniknął.
bafsar
3

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ć.

DreamEvil
źródło
Nawet nie przyszło mi do głowy, że to może się zdarzyć, ponieważ zawsze utrzymywałem projekty moich witryn jako samodzielne, zamiast rozdzielać rzeczy na kilkanaście części „z powodu architektury”. Nowy zespół, nowe konwencje, nowe szanse na internalizację niektórych opcji, które nie były dla mnie przydatne.
brichins
2

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ć ...

Lyall
źródło
1

Ż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.

joel1618
źródło
1

spróbuj tego kodu, zmień tylko nazwę

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
źródło
0

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.

Raj Kishor Gupta
źródło
0

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.

[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
Despertar
źródło
0

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:

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
źródło
0

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.

Terry Mosoma
źródło
0

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

Phate01
źródło
0

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.

Hunter-Orionnoir
źródło