"X" adlı bir rota zaten rota koleksiyonunda bulunuyor. Rota adları benzersiz olmalıdır. ASP.NET MVC 3 ile ilgili özel durum


98

Bir ASP.NET MVC 3 web hizmeti yapıyorum ve bu istisnayı aralıklı olarak almaya devam ediyorum.

Yığın izleme:

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

Muhtemelen, Route Debugger'ın değiştirdiğim veya sildiğim ve gitmeyeceğim (makinemi yeniden başlattıktan sonra bile) bazı eski rotalarım olduğunu göstermesi gerçeğiyle ilgilidir. Yığın izleme ayrıca uzun süredir silinen ve uygulamam yeni bir konuma taşınmış, o zamandan beri temizlenmiş ve yeniden oluşturulmuş bir kaynak dosyaya da atıfta bulunuyor. Neyi kaçırıyorum?

İşte tüm güzergah kayıt kodum:

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

    }
}

Rotaları belirlediğiniz başka bir yeriniz var mı? Alanlar?
Shyju

Yığın izlemeyi ekledim ve rotalarım hakkında ek bilgiler ekledim.
Rn222

Yanıtlar:


297

Bu sorunu çözmek için projemdeki bin klasörüne gitmem, tüm DLL dosyalarını silmem ve ardından yeniden oluşturmam gerekti ve bu sorunu çözdü.


11
Sadece çözümü temizleyerek aynı şeyi yapıyoruz.
Fabio Milheiro

84
@Bomboca - temizleme, projenin parçası olmayan DLL'leri silmez. Örneğin, projenizin derleme adını değiştirdiyseniz, eski derleme binklasörde kalacaktır .
Josh M.

2
Aynı sorunu yaşıyordum ve bu sorunumu hemen çözdü. Teşekkür ederim!
Aluan Haddad

1
Projemi yeniden adlandırdı ve eski DLL hala bin klasöründeydi. Lütfen insanlar: kalıcı çözüm, YAYINLAMA sırasında, önce hedef dizindeki tüm dosyaları silin! (dizine yayınlarken seçenek)
StijnSpijker

2
Neden bilmiyorum ama "Temiz çözüm" bende işe yaramıyor. Çözümünüz işe yarıyor.
user2980426

19

Bu hata birden çok nedenden dolayı ortaya çıkabilir, aynı hatayı aldım ve Global.asax sınıfını değiştirerek çözdüm.

Global.asax.cs'deki Application_Start yöntemi şöyleydi:

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

Bu yöntemde aşağıdaki satır iki kez meydana gelir:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Bu, rotanın rota listesine iki kez eklenmesini ve aynı zamanda hataya neden olmasını sağladı.

Application_Start yöntemini aşağıdaki gibi değiştirdim ve hata ortadan kalktı:

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

Bu, sorununuz için çözüm olmayabilir, ancak gelecekte başkalarına yardımcı olabilir. Bu cevabı diğerleri arasında görmedim, bu yüzden bunu eklemeye karar verdim.


2
AreaRegistration.RegisterAllAreas () öğesine de yinelenen bir çağrı var.
Spivonious

Ayrıca bununla karşılaştım: WebApiConfig.Register (GlobalConfiguration.Configuration); GlobalConfiguration.Configure (WebApiConfig.Register) ile; her ikisi de WebApiConfig.cs'de aynı yöntemi çağırır. Trick elbette rota adının belirlendiği yerde bir mola vermek ve çağrı yığınına bakmaktır.
Reid

Bu hatayı alıyordum ve diğer çözümlerden hiçbiri benim için işe yaramadı, ancak sonra yinelenen AreaRegistration.RegisterAllAreas (); global.asax dosyamdaki satırlar. Bunlardan birinin kaldırılması hatayı ortadan kaldırdı.
ewomack

10

Global.asax'ın yeniden adlandırmadan önce sitenin DLL dosyasının eski bir sürümüne başvurduğunu öğrendim. VS projesi / çözümü artık ona başvurmadığından, Build> Clean up yaptığımda DLL temizlenmiyordu. Görünüşe göre bazen DLL'nin yalnızca daha yeni sürümü kullanılıyordu ve bu da sitenin düzgün çalışmasına izin veriyordu, ancak sonunda her ikisi de yol çakışmalarına neden olacak şekilde yüklenecekti.


bin ve obj silmek projemi yeniden adlandırdıktan sonra benim için çalıştı.
Steve

3
Global.asax'ın eski bir DLL'den bahsettiğini nasıl anladınız?
xaisoft

@xiasoft: Eski DLL, sildiğim yolları içeriyordu, ancak Route Debugger hala orada olduklarını gösterdi. Eski DLL'yi sildiğimde eski yollar da kaldırıldı.
Rn222

4

Rotalar, AppDomain.CurrentDomain içindeki tüm montajlardan yüklenir, bu nedenle eski montajlarınız hala bunun bir parçasıysa, hala eski / yinelenen rotaları alıyor olabilirsiniz.


3
Sorunun bu olup olmadığını nasıl kontrol edebilirim?
Rn222

Doğru. Benim projemde oldu. Adını değiştirdiğimde bu hatayla karşılaştım. Eski montajı çıkardıktan sonra, hata gitti.
bafsar

3

Benim durumumda yine MVC olan çözümden başka bir projeye referans eklediğimde ve alanda aynı isimleri kullandığımda bu sorunla karşılaştım (Bu projeyi eklemek istemedim, nasıl oldu bilmiyorum ). Bu DLL dosyasını kaldırdığımda proje çalışmaya başladı.


Bunun olabileceği aklıma bile gelmemişti, çünkü site projelerimi her zaman işleri bir düzine parçaya bölmek yerine kendi kendine yeten tuttum "çünkü mimari". Yeni takım, yeni konvansiyonlar, henüz yararlı bulamadığım bazı seçenekleri içselleştirme şansı.
brichins

2

DLL'leri tek başına silmek benim için işe yaramadı (VS2013'te), ancak tüm 'bin' ve 'obj' klasörlerini silmek ve ardından çözümü oluşturmak mükemmel bir şekilde çalıştı! Bunu düzeltmek için bu kadar uzun süre uğraşmasaydım keşke ...


1

Önerilerin hiçbiri benim için işe yaramadı. Devam edip web sunucusunu yeniden başlattım (bu durumda IIS) ve bu, kodu düzelttikten sonra hatayı temizledi. DLL, IIS'de önbelleğe alınmış olmalıdır.


1

bu kodu deneyin, sadece adı değiştirin

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

0

Ben de aynı hatayı alıyorum. Ama sonunda bir çözüm buldum. Senaryo: Web api mvc4 uygulamama farklı (mvc4 uygulaması) dll ekliyorum. Koşmaya çalıştığınızda. Ben de aynı hatayı alıyorum. Temel Neden - Web api uygulamam çalıştığında .Application tüm alanı kendinden kaydettirir ve geçerli uygulama etki alanı dll referanslarına yüklemeye başlar. Uygulama yükleme dll'sini (MVC4 uygulaması) yüklediğinde bu sefer hata alıyor çünkü mevcut maproute "HelpPage_Default" için anahtar ekliyor.

Çözüm. 1. maproute'daki RegisterArea için anahtarı mevcut uygulamada veya mevcut uygulamada değiştirin (Bakın dll). 2. kod dll (mvc4 uygulaması) kodunu farklı liberaryaya taşıyın ve yeni dll'ye bakın.


0

AttributeRoutingHttpConfig.Start()Global.asax'ımda manuel olarak arıyorum . Otomatik olarak çağıran dosyanın en üstündeki bu otomatik oluşturulan satırı fark etmedim.

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

0

Başka bir siteye yönlendirilen kimlik doğrulama için kullanılan üçüncü taraf bir bileşenle MVC'ye taşınan bir Forms uygulaması olan bir uygulamam vardı. Kullanıcı zaten oturum açmamışsa bileşen iki kez oturum başlatır (biri siteye ilk bağlantı için ve biri geri dönüş için). Ben de bunu şu kodla çözdüm:

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


0

Bin klasöründeki dll'leri silmek% 100 çalıştı, hala projemin yeniden inşa etmek için gereken dll'leri vardı. Bunun yerine, bin klasörünün bir kopyasını oluşturun. daha sonra orijinali silin. projeyi yeniden oluşturun. başarısız olursa, eksik dll'leri bin klasörüne yerleştirin.


0

Eski bir MVC2 web sitesini çalıştırıyordum ve bu sorunu aldım çünkü IIS "Yönetilen Ardışık Düzen Modu" varsayılan olarak "Entegre" olarak ayarlandı (projede F4'e basın). Bunu 'Klasik' olarak değiştirmek sorunu çözdü


0

Bir Azure Uygulama Hizmeti'nde yayınlarken, eski proje DLL'sini ve sembol dosyalarını kaldırabilmek için Yayınlama İletişim Kutusunun "Ayarlar" -> "Dosya Yayımlama Seçenekleri" -> "Hedefteki ek dosyaları kaldır" seçeneğini kontrol etmem gerekiyordu. Ardından site yüklenir.

Bu özünde mevcut cevaplar (Fleas) çözümüdür. Sorunlu DLL'yi silin.

Bu eski DLL'nin saklanmasına neden olan şey, web sitesinin eski bir sürümünü yüklüyordum (MVC 3 ~ 5 şablonları, ancak yeni sürüm bu projenin bir kopyası olduğundan, farklı ad alanları ile farklı web projeleri, yakın geçmişte bir noktaya değindi. ) Yeni projenin DLL'lerinin silinmesi gerekiyordu. Bunu başarmanın çeşitli yolları vardır. Bir iletişim kutusu kullanarak en kolay atm olduğunu buldum. Dosya sistemine giriş yapmak ve dosyaları elle eksenlemek de kesinlikle işe yarıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.