Rute bernama "x" sudah ada di koleksi rute. Nama rute harus unik. Pengecualian dengan ASP.NET MVC 3

98

Saya melakukan layanan web ASP.NET MVC 3 dan saya terus mendapatkan pengecualian ini sesekali.

Jejak tumpukan:

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

Ini mungkin terkait dengan fakta bahwa Route Debugger menunjukkan bahwa saya memiliki beberapa rute lama yang telah saya ubah atau hapus dan tidak akan hilang (bahkan setelah me-reboot mesin saya). Pelacakan tumpukan juga mengacu pada file sumber yang telah lama dihapus dan aplikasi saya telah dipindahkan ke lokasi baru, dibersihkan dan dibangun kembali sejak saat itu. Apa yang saya lewatkan?

Ini semua kode registrasi rute saya:

// 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
sumber
Apakah Anda memiliki tempat lain yang Anda tentukan rute? Area?
Shyju
Saya menambahkan pelacakan tumpukan dan menambahkan info tambahan tentang rute saya.
Rn222

Jawaban:

297

Untuk memperbaiki masalah ini saya harus masuk ke folder bin di proyek saya, menghapus semua file DLL dan kemudian membangun kembali dan ini memperbaiki masalah.

Kutu
sumber
11
Cukup membersihkan solusi kita melakukan hal yang sama.
Fabio Milheiro
84
@Bomboca - pembersihan tidak menghapus DLL yang bukan bagian dari proyek. Misalnya jika Anda mengubah nama rakitan proyek Anda, rakitan lama akan tetap berada di binfolder.
Josh M.
2
Saya mengalami masalah yang sama dan ini segera menyelesaikan masalah saya. Terima kasih!
Aluan Haddad
1
Mengganti nama proyek saya, dan DLL lama masih ada di folder bin. Tolong orang: solusi permanen, saat PUBLIKASI, hapus semua file di direktori target terlebih dahulu! (opsi saat menerbitkan ke direktori)
StijnSpijker
2
Saya tidak tahu mengapa, tetapi "Solusi bersih" tidak berhasil untuk saya. Solusi Anda berhasil.
pengguna2980426
19

Kesalahan ini dapat terjadi karena beberapa penyebab, saya memiliki kesalahan yang sama dan mengatasinya dengan memodifikasi kelas Global.asax.

Metode Application_Start di Global.asax.cs seperti:

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

Baris berikut muncul dua kali dalam metode ini:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Ini memastikan bahwa rute tersebut dua kali ditambahkan ke daftar rute dan pada saat yang sama menyebabkan kesalahan.

Saya mengubah metode Application_Start sebagai berikut dan kesalahan menghilang:

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

Ini mungkin bukan jawaban untuk masalah Anda, tetapi mungkin dapat membantu orang lain di masa depan. Saya tidak melihat jawaban ini di antara yang lain, jadi saya memutuskan untuk menambahkan ini.

Max
sumber
2
Ada panggilan duplikat ke AreaRegistration.RegisterAllAreas () juga.
Spivonious
Juga, saya mengalami ini: WebApiConfig.Register (GlobalConfiguration.Configuration); dengan GlobalConfiguration.Configure (WebApiConfig.Register); keduanya memanggil metode yang sama di WebApiConfig.cs. Trik tentu saja untuk memberi jeda di mana nama rute ditetapkan dan melihat tumpukan panggilan.
Reid
Saya mendapatkan kesalahan ini dan tidak ada solusi lain yang bekerja untuk saya, tetapi kemudian saya menemukan duplikat AreaRegistration.RegisterAllAreas (); baris di file global.asax saya. Menghapus salah satunya menghilangkan kesalahan.
ewomack
10

Saya menemukan bahwa Global.asax merujuk ke versi lama file DLL situs sebelum saya mengganti namanya. DLL tidak sedang dibersihkan ketika saya melakukan Build> Clean up karena proyek / solusi VS tidak merujuknya lagi. Tampaknya terkadang hanya versi DLL yang lebih baru yang digunakan, yang memungkinkan situs bekerja dengan benar, tetapi pada akhirnya keduanya akan dimuat yang menyebabkan konflik rute.

Rn222
sumber
menghapus bin dan obj bekerja untuk saya setelah mengganti nama proyek saya.
Steve
3
Bagaimana Anda mengetahui bahwa Global.asax mengacu pada DLL lama?
xaisoft
@xiasoft: DLL lama berisi rute yang telah saya hapus tetapi Route Debugger menunjukkan bahwa mereka masih ada. Ketika saya menghapus DLL lama, rute lama juga dihapus.
Rn222
4

Rute dimuat dari semua rakitan dalam AppDomain.CurrentDomain, jadi jika rakitan lama Anda masih menjadi bagian dari itu, Anda mungkin masih mendapatkan rute lama / duplikat.

Filip W
sumber
3
Bagaimana saya bisa memeriksa untuk melihat apakah ini masalahnya?
Rn222
Betul sekali. Itu terjadi pada proyek saya. Ketika saya mengganti namanya, terjadi kesalahan ini. Setelah menghapus perakitan lama, kesalahan telah hilang.
bafsar
3

Dalam kasus saya, saya menghadapi masalah ini, ketika saya menambahkan referensi ke proyek lain dari solusi, yang juga MVC dan menggunakan nama yang sama di area (saya tidak ingin menambahkan proyek ini, saya tidak tahu bagaimana itu terjadi ). Ketika saya menghapus DLL ini, proyek mulai bekerja.

DreamEvil
sumber
Bahkan tidak terpikir oleh saya bahwa ini bisa terjadi, karena saya selalu menyimpan proyek situs saya sendiri daripada memecah hal-hal menjadi lusinan bagian "karena arsitektur". Tim baru, konvensi baru, peluang baru untuk menginternalisasi beberapa opsi yang menurut saya belum berguna.
Brichins
2

Menghapus DLL saja tidak berhasil untuk saya (di VS2013), tetapi menghapus seluruh folder 'bin' dan 'obj' dan kemudian membangun solusi bekerja dengan sempurna! Membuat saya berharap saya tidak menghabiskan waktu lama untuk memperbaikinya ...

Lyall
sumber
1

Tidak ada saran yang berhasil untuk saya. Pergi ke depan dan restart server web (IIS dalam kasus ini) dan itu menghapus kesalahan setelah saya memperbaiki kode. DLL harus telah di-cache di IIS.

joel1618
sumber
1

coba kode ini, hanya ganti nama

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

Saya mendapatkan kesalahan yang sama. Tapi akhirnya saya punya solusi. Skenario: Saya menambahkan dll yang berbeda (aplikasi mvc4) di aplikasi mvc4 api web saya. Saat mencoba lari. Saya mendapatkan kesalahan yang sama. Akar Penyebab- Ketika aplikasi api web saya berjalan. Aplikasi mendaftarkan semua area dari diri sendiri dan mulai memuat ke referensi dll domain aplikasi saat ini. Saat aplikasi memuat dll (aplikasi MVC4) saat itu mendapatkan error karena maproute saat ini sudah menambahkan key untuk "HelpPage_Default".

Larutan. 1. Ubah kunci RegisterArea di maproute baik aplikasi saat ini atau aplikasi yang sudah ada (Lihat dll). 2. Pindahkan kode dll (aplikasi mvc4) ke bebas yang berbeda dan lihat dll baru.

Raj Kishor Gupta
sumber
0

Saya menelepon secara manual AttributeRoutingHttpConfig.Start()di Global.asax saya. Tidak memperhatikan baris yang dibuat secara otomatis di bagian atas file yang secara otomatis memanggilnya.

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

Saya memiliki aplikasi yang merupakan aplikasi Formulir yang dimigrasikan ke MVC dengan komponen pihak ketiga yang digunakan untuk otentikasi yang dialihkan ke situs lain. Komponen akan memulai sesi dua kali jika pengguna belum masuk (sekali untuk koneksi awal ke situs dan sekali untuk kembali). Jadi saya menyelesaikan ini dengan kode berikut:

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

Menghapus dll di folder bin berhasil 100%, saya masih memiliki dll proyek saya yang perlu dibangun kembali. Melainkan membuat salinan folder bin. kemudian hapus proyek asli.rebuild. jika gagal, tempatkan dll yang hilang ke dalam folder bin.

Terry Mosoma
sumber
0

Saya menjalankan situs web MVC2 lama dan saya mendapat masalah ini karena 'Managed Pipeline Mode' IIS diatur ke 'Terintegrasi' secara default (tekan F4 pada proyek). Mengubahnya menjadi 'Klasik' memperbaiki masalah

Phate01
sumber
0

Saat menerbitkan ke Layanan Aplikasi Azure, saya harus memeriksa "Pengaturan" Dialog Publikasikan -> "Opsi Penerbitan File" -> "Hapus file tambahan di tujuan" untuk menghapus file DLL dan simbol proyek lama. Kemudian situs tersebut akan dimuat.

Ini pada dasarnya adalah solusi jawaban saat ini (Fleas) di intinya. Hapus DLL yang melanggar.

Apa yang menyebabkan DLL lama ini dipertahankan adalah saya memuat versi lama situs web (templat MVC 3 ~ 5 tetapi proyek web yang berbeda dengan ruang nama yang bertabrakan, karena versi yang lebih baru adalah salinan dari proyek ini yang dibuat beberapa poin di masa lalu. ) DLL proyek yang lebih baru hanya perlu dihapus. Ada berbagai cara untuk mencapai ini. Saya menemukan menggunakan dialog sebagai atm termudah. Masuk ke sistem file dan menghapus file dengan tangan pasti berfungsi juga.

Hunter-Orionnoir
sumber