เส้นทางชื่อ“ x” อยู่ในคอลเล็กชันเส้นทางแล้ว ชื่อเส้นทางต้องไม่ซ้ำกัน ข้อยกเว้นกับ ASP.NET MVC 3


98

ฉันใช้บริการเว็บ ASP.NET MVC 3 และได้รับข้อยกเว้นนี้เป็นระยะ ๆ

ติดตามกอง:

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

อาจเกี่ยวข้องกับการที่ Route Debugger แสดงให้เห็นว่าฉันมีเส้นทางเก่าบางส่วนที่ฉันได้แก้ไขหรือลบไปแล้วและจะไม่หายไป (แม้ว่าจะรีบูตเครื่องแล้วก็ตาม) การติดตามสแต็กยังอ้างถึงไฟล์ต้นฉบับที่ถูกลบไปนานแล้วและแอพของฉันถูกย้ายไปยังตำแหน่งใหม่ล้างและสร้างใหม่ตั้งแต่นั้นมา ฉันขาดอะไรไป?

นี่คือรหัสลงทะเบียนเส้นทางทั้งหมดของฉัน:

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

    }
}

คุณมีสถานที่อื่นที่คุณกำหนดเส้นทางหรือไม่? พื้นที่?
Shyju

ฉันเพิ่มการติดตามสแต็กและเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับเส้นทางของฉัน
Rn222

คำตอบ:


297

ในการแก้ไขปัญหานี้ฉันต้องเข้าไปในโฟลเดอร์ bin ในโครงการของฉันลบไฟล์ DLL ทั้งหมดแล้วสร้างใหม่และสิ่งนี้ช่วยแก้ปัญหาได้


11
เพียงแค่ทำความสะอาดสารละลายเราก็ทำสิ่งเดียวกัน
Fabio Milheiro

84
@Bomboca - การทำความสะอาดไม่ได้ลบ DLL ที่ไม่ได้เป็นส่วนหนึ่งของโครงการ เช่นถ้าคุณเปลี่ยนชื่อแอสเซมบลีของโปรเจ็กต์แอสเซมบลีเก่าจะยังคงอยู่ในbinโฟลเดอร์
Josh M.

2
ฉันพบปัญหาเดียวกันและสิ่งนี้สามารถแก้ไขปัญหาของฉันได้ทันที ขอบคุณ!
Aluan Haddad

1
เปลี่ยนชื่อโครงการของฉันและ DLL เก่ายังอยู่ในโฟลเดอร์ bin โปรดคน: วิธีแก้ปัญหาถาวรเมื่อเผยแพร่ให้ลบไฟล์ทั้งหมดในไดเรกทอรีเป้าหมายก่อน! (ตัวเลือกเมื่อเผยแพร่ไปยังไดเร็กทอรี)
StijnSpijker

2
ฉันไม่รู้ว่าทำไม แต่ "โซลูชันที่สะอาด" ไม่ได้ผลสำหรับฉัน โซลูชันของคุณใช้ได้ผล
user2980426

20

ข้อผิดพลาดนี้อาจเกิดขึ้นได้เนื่องจากสาเหตุหลายประการฉันมีข้อผิดพลาดเดียวกันและแก้ไขได้โดยการแก้ไขคลาส Global.asax

วิธี Application_Start ที่ Global.asax.cs เป็นเหมือน:

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

บรรทัดต่อไปนี้เกิดขึ้นสองครั้งในวิธีนี้:

RouteConfig.RegisterRoutes(RouteTable.Routes);

สิ่งนี้ทำให้มั่นใจได้ว่ามีการเพิ่มเส้นทางสองครั้งในรายการเส้นทางและในเวลาเดียวกันก็ทำให้เกิดข้อผิดพลาด

ฉันเปลี่ยนวิธี Application_Start ดังนี้และข้อผิดพลาดหายไป:

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

นี่อาจไม่ใช่คำตอบสำหรับปัญหาของคุณ แต่อาจช่วยผู้อื่นได้ในอนาคต ฉันไม่เห็นคำตอบนี้ระหว่างคนอื่น ๆ ดังนั้นฉันจึงตัดสินใจเพิ่มสิ่งนี้


2
มีการเรียกซ้ำไปยัง AreaRegistration.RegisterAllAreas () ด้วย
Spivonious

นอกจากนี้ฉันพบสิ่งนี้: WebApiConfig.Register (GlobalConfiguration.Configuration); ด้วย GlobalConfiguration.Configure (WebApiConfig.Register); ทั้งสองเรียกวิธีเดียวกันใน WebApiConfig.cs เคล็ดลับคือการหยุดพักที่ตั้งชื่อเส้นทางและดูที่กลุ่มการโทร
Reid

ฉันได้รับข้อผิดพลาดนี้และไม่มีวิธีแก้ปัญหาอื่นใดที่ใช้ได้ผลสำหรับฉัน แต่แล้วฉันก็พบว่ามีการซ้ำ AreaRegistration.RegisterAllAreas (); บรรทัดในไฟล์ global.asax ของฉัน การลบหนึ่งในนั้นเป็นการลบข้อผิดพลาด
ewomack

10

ฉันพบว่า Global.asax อ้างถึงเวอร์ชันเก่าของไฟล์ DLL ของไซต์ก่อนที่ฉันจะเปลี่ยนชื่อ DLL ไม่ได้รับการล้างข้อมูลเมื่อฉันสร้าง> ล้างข้อมูลเนื่องจากโครงการ VS / โซลูชันไม่ได้อ้างถึงอีกต่อไป ดูเหมือนว่าบางครั้งจะมีการใช้ DLL เวอร์ชันที่ใหม่กว่าเท่านั้นทำให้ไซต์ทำงานได้อย่างถูกต้อง แต่ในที่สุดทั้งสองก็จะถูกโหลดทำให้เส้นทางขัดแย้ง


การลบ bin และ obj ใช้ได้ผลสำหรับฉันหลังจากเปลี่ยนชื่อโครงการของฉัน
Steve

3
คุณทราบได้อย่างไรว่า Global.asax อ้างถึง DLL เก่า
xaisoft

@xiasoft: DLL เก่ามีเส้นทางที่ฉันลบไปแล้ว แต่ Route Debugger แสดงให้เห็นว่ายังอยู่ที่นั่น เมื่อฉันลบ DLL เก่าเส้นทางเก่าก็ถูกลบไปด้วย
Rn222

4

เส้นทางจะถูกโหลดจากแอสเซมบลีทั้งหมดภายใน AppDomain.CurrentDomain ดังนั้นหากแอสเซมบลีเก่าของคุณยังคงเป็นส่วนหนึ่งคุณอาจยังได้รับเส้นทางเก่า / ซ้ำกัน


3
จะตรวจสอบได้อย่างไรว่าเป็นปัญหาหรือไม่
Rn222

ถูกตัอง. มันเกิดขึ้นกับโครงการของฉัน เมื่อฉันเปลี่ยนชื่อเกิดข้อผิดพลาดนี้ หลังจากถอดชุดประกอบเก่าแล้วข้อผิดพลาดได้หายไป
bafsar

3

ในกรณีของฉันฉันต้องเผชิญกับปัญหานี้เมื่อฉันเพิ่มการอ้างอิงไปยังโครงการอื่นจากโซลูชันซึ่งก็คือ MVC และใช้ชื่อเดียวกันในพื้นที่ (ฉันไม่ต้องการเพิ่มโครงการนี้ฉันไม่รู้ว่ามันเกิดขึ้นได้อย่างไร ). เมื่อฉันลบ DLL นี้โปรเจ็กต์ก็เริ่มทำงาน


มันไม่เคยเกิดขึ้นกับฉันด้วยซ้ำว่าสิ่งนี้อาจเกิดขึ้นได้เนื่องจากฉันมักจะเก็บโครงการไซต์ของฉันไว้ในตัวแทนที่จะแยกสิ่งต่างๆออกเป็นโหล ๆ "เพราะสถาปัตยกรรม" ทีมใหม่การประชุมใหม่โอกาสใหม่ในการปรับตัวเลือกบางอย่างที่ฉันยังไม่พบว่ามีประโยชน์
brichins

2

การลบ DLL เพียงอย่างเดียวไม่ได้ผลสำหรับฉัน (ใน VS2013) แต่การลบโฟลเดอร์ 'bin' และ 'obj' ทั้งหมดจากนั้นสร้างโซลูชันได้อย่างสมบูรณ์แบบ! ทำให้ฉันหวังว่าฉันจะไม่ใช้เวลานานมากในการพยายามแก้ไข ...


1

ไม่มีคำแนะนำใดที่ใช้ได้ผลสำหรับฉัน ดำเนินการต่อและรีสตาร์ทเว็บเซิร์ฟเวอร์ (IIS ในกรณีนี้) และนั่นเป็นการล้างข้อผิดพลาดหลังจากที่ฉันแก้ไขรหัสแล้ว DLL ต้องถูกแคชใน IIS


1

ลองใช้รหัสนี้เปลี่ยนชื่อเท่านั้น

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

ฉันได้รับข้อผิดพลาดเดียวกัน แต่ในที่สุดฉันก็มีทางออก สถานการณ์จำลอง: ฉันกำลังเพิ่ม dll (แอปพลิเคชัน mvc4) ที่แตกต่างกันในแอปพลิเคชันเว็บ api mvc4 ของฉัน เมื่อลองเรียกใช้. ฉันได้รับข้อผิดพลาดเดียวกัน สาเหตุหลัก - เมื่อแอปพลิเคชันเว็บ API ของฉันทำงานแอปพลิเคชันลงทะเบียนพื้นที่ทั้งหมดจากตัวเองและเริ่มโหลดไปยังการอ้างอิง dll โดเมนแอปพลิเคชันปัจจุบัน เมื่อแอปพลิเคชันโหลด dll (แอปพลิเคชัน MVC4) ครั้งนั้นได้รับข้อผิดพลาดเนื่องจาก maproute ปัจจุบันได้เพิ่มคีย์สำหรับ "HelpPage_Default" แล้ว

วิธีการแก้. 1. เปลี่ยนคีย์สำหรับ RegisterArea ใน maproute ไม่ว่าจะเป็นแอปพลิเคชันปัจจุบันหรือแอปพลิเคชันที่มีอยู่ (อ้างอิง dll) 2. ย้ายรหัส dll (แอปพลิเคชัน mvc4) รหัสไปยังเสรีอื่น ๆ และอ้างถึง dll ใหม่


0

ฉันโทรด้วยตนเองAttributeRoutingHttpConfig.Start()ใน Global.asax ของฉัน ไม่สังเกตเห็นบรรทัดที่สร้างขึ้นโดยอัตโนมัตินี้ที่ด้านบนของไฟล์ซึ่งเรียกมันโดยอัตโนมัติ

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

0

ฉันมีแอปพลิเคชันที่เป็นแอป Forms ที่ย้ายไปยัง MVC โดยมีส่วนประกอบของบุคคลที่สามที่ใช้สำหรับการตรวจสอบสิทธิ์ซึ่งเปลี่ยนเส้นทางไปยังไซต์อื่น คอมโพเนนต์จะเริ่มเซสชันสองครั้งหากผู้ใช้ยังไม่ได้เข้าสู่ระบบ (หนึ่งครั้งสำหรับการเชื่อมต่อครั้งแรกกับไซต์และอีกครั้งสำหรับการส่งคืน) ดังนั้นฉันจึงแก้ไขสิ่งนี้ด้วยรหัสต่อไปนี้:

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

การลบ dll ในโฟลเดอร์ bin ใช้งานได้ 100% ฉันยังมี dll ที่ต้องสร้างโครงการใหม่ แทนที่จะทำสำเนาโฟลเดอร์ bin จากนั้นลบต้นฉบับสร้างโครงการใหม่ หากล้มเหลวให้วาง dll ที่หายไปในโฟลเดอร์ bin


0

ฉันใช้งานเว็บไซต์ MVC2 เก่าและพบปัญหานี้เนื่องจาก IIS 'Managed Pipeline Mode' ถูกตั้งค่าเป็น 'Integrated' โดยค่าเริ่มต้น (กด F4 บนโปรเจ็กต์) การเปลี่ยนเป็น "คลาสสิก" ช่วยแก้ปัญหาได้


0

เมื่อเผยแพร่ไปยัง Azure App Service ฉันต้องตรวจสอบ "การตั้งค่า" ของกล่องโต้ตอบการเผยแพร่ -> "ตัวเลือกการเผยแพร่ไฟล์" -> "ลบไฟล์เพิ่มเติมที่ปลายทาง" เพื่อเอา ​​DLL และไฟล์สัญลักษณ์ของโครงการเก่าออก จากนั้นไซต์จะโหลด

นี่คือคำตอบปัจจุบัน (หมัด) ที่เป็นแกนหลัก ลบ DLL ที่ละเมิด

สิ่งที่ทำให้ DLL เก่านี้ถูกเก็บไว้คือฉันกำลังโหลดเวอร์ชันเก่าของเว็บไซต์ (เทมเพลต MVC 3 ~ 5 แต่โปรเจ็กต์เว็บต่างกันที่มีเนมสเปซชนกันเนื่องจากเวอร์ชันที่ใหม่กว่าเป็นสำเนาของโปรเจ็กต์นี้ทำให้มีบางจุดในอดีตที่ผ่านมา ) DLL ของโปรเจ็กต์ที่ใหม่กว่าจำเป็นต้องถูกลบ มีหลายวิธีในการบรรลุเป้าหมายนี้ ฉันพบว่าการใช้กล่องโต้ตอบเป็นตู้เอทีเอ็มที่ง่ายที่สุด การเข้าสู่ระบบไฟล์และการแบ่งไฟล์ด้วยมือก็ใช้ได้ผลเช่นกัน


0

หากคุณกำลังกำหนดเวอร์ชันและคุณใช้สอง API ที่มีชื่อเดียวกันคุณจะได้รับข้อผิดพลาดนี้ หากคุณต้องการ Get เดียวกันให้ลองเปลี่ยนแอตทริบิวต์ Name ของเส้นทาง:

TestsController.cs:

      [MapToApiVersion("1.0")]
      [Route("{moniker}", Name = "GetTest")]
      public async Task<IHttpActionResult> Get(string moniker, bool param1 = false)

  [MapToApiVersion("1.1")]
  [Route("{moniker}", Name = "GetTest11")] // Change name here for a different version
  public async Task<IHttpActionResult> Get(string moniker)

และส่งต่อในเวอร์ชันใน URL:

http: // localhost: 6600 / api / การทดสอบ / 2020? api-version = 1.1


0

ประสบปัญหานี้ ปัญหาเกิดขึ้นหลังจากเพิ่มพื้นที่ในโครงการของฉัน มีการเรียกร้องMapMvcAttributeRoutes()ในRegisterArea()วิธีการ ดังนั้นคุณไม่ควรมองหาชื่อเส้นทางที่ซ้ำกันเพียงแค่มองหาการMapMvcAttributeRoutes()โทรที่ซ้ำกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.