Tuyến đường có tên “x” đã có trong bộ sưu tập tuyến đường. Tên tuyến đường phải là duy nhất. Ngoại lệ với ASP.NET MVC 3


98

Tôi đang sử dụng dịch vụ web ASP.NET MVC 3 và tôi liên tục nhận được ngoại lệ này.

Dấu vết ngăn xếp:

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

Nó có thể liên quan đến thực tế là Trình gỡ lỗi tuyến đường cho thấy rằng tôi có một số tuyến đường cũ mà tôi đã sửa đổi hoặc xóa và sẽ không biến mất (ngay cả sau khi khởi động lại máy của tôi). Dấu vết ngăn xếp cũng đề cập đến một tệp nguồn đã bị xóa từ lâu và ứng dụng của tôi đã được chuyển đến vị trí mới, được làm sạch và xây dựng lại kể từ đó. Tôi đang thiếu gì?

Đây là tất cả mã đăng ký tuyến đường của tôi:

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

    }
}

Bạn có một nơi khác mà bạn đã xác định các tuyến đường? Khu vực ?
Shyju

Tôi đã thêm dấu vết ngăn xếp và thêm thông tin bổ sung về các tuyến đường của mình.
Rn222

Câu trả lời:


297

Để khắc phục sự cố này, tôi phải vào thư mục bin trong dự án của mình, xóa tất cả các tệp DLL và sau đó xây dựng lại và điều này đã khắc phục sự cố.


11
Đơn giản chỉ cần làm sạch dung dịch chúng tôi làm tương tự.
Fabio Milheiro

84
@Bomboca - dọn dẹp không xóa các tệp DLL không phải là một phần của dự án. Ví dụ: nếu bạn thay đổi tên assembly của dự án, thì assembly cũ sẽ vẫn còn trong binthư mục.
Josh M.

2
Tôi đang gặp phải vấn đề tương tự và điều này đã giải quyết vấn đề của tôi ngay lập tức. Cảm ơn bạn!
Aluan Haddad

1
Đã đổi tên dự án của tôi và tệp DLL cũ vẫn nằm trong thư mục bin. Xin mọi người: giải pháp vĩnh viễn, khi XUẤT BẢN, hãy xóa tất cả các tệp trong thư mục đích trước! (tùy chọn khi xuất bản vào thư mục)
StijnSpijker

2
Tôi không biết tại sao nhưng "Dung dịch sạch" không hiệu quả với tôi. Giải pháp của bạn hoạt động.
user2980426

19

Lỗi này có thể xảy ra do nhiều nguyên nhân, tôi đã gặp lỗi tương tự và đã giải quyết nó bằng cách sửa đổi lớp Global.asax.

Phương thức Application_Start tại Global.asax.cs giống như sau:

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

Dòng sau xảy ra hai lần trong phương pháp này:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Điều này đảm bảo rằng tuyến đường đã được thêm hai lần vào danh sách tuyến đường và đồng thời gây ra lỗi.

Tôi đã thay đổi phương thức Application_Start như sau và lỗi đã biến mất:

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

Đây có thể không phải là câu trả lời cho vấn đề của bạn, nhưng có thể giúp ích cho những người khác trong tương lai. Tôi không thấy câu trả lời này giữa những người khác, vì vậy tôi quyết định thêm câu trả lời này.


2
Cũng có một lệnh gọi trùng lặp tới AreaRegistration.RegisterAllAreas ().
Spivonious

Ngoài ra, tôi gặp phải điều này: WebApiConfig.Register (GlobalConfiguration.Configuration); với GlobalConfiguration.Configure (WebApiConfig.Register); cả hai đều gọi cùng một phương thức trong WebApiConfig.cs. Tất nhiên, thủ thuật là đặt một break ở nơi đặt tên tuyến đường và nhìn vào ngăn xếp cuộc gọi.
Reid

Tôi gặp phải lỗi này và không có giải pháp nào khác phù hợp với tôi, nhưng sau đó tôi tìm thấy AreaRegistration.RegisterAllAreas () trùng lặp; trong tệp global.asax của tôi. Loại bỏ một trong số chúng đã loại bỏ lỗi.
ewomack

10

Tôi phát hiện ra rằng Global.asax đang tham chiếu đến phiên bản cũ của tệp DLL của trang web trước khi tôi đổi tên nó. DLL không được dọn dẹp khi tôi thực hiện Xây dựng> Dọn dẹp vì dự án / giải pháp VS không tham chiếu đến nó nữa. Có vẻ như đôi khi chỉ có phiên bản mới hơn của DLL được sử dụng, cho phép trang web hoạt động chính xác, nhưng cuối cùng cả hai đều được tải gây ra xung đột tuyến đường.


xóa bin và obj đã làm việc cho tôi sau khi đổi tên dự án của tôi.
Steve

3
Làm thế nào bạn phát hiện ra Global.asax đang đề cập đến một DLL cũ?
xaisoft

@xiasoft: DLL cũ chứa các tuyến đường mà tôi đã xóa nhưng Trình gỡ lỗi tuyến đường cho thấy chúng vẫn ở đó. Khi tôi xóa DLL cũ, các tuyến cũ cũng bị xóa.
Rn222

4

Các tuyến được tải từ tất cả các cụm trong AppDomain.CurrentDomain, vì vậy nếu các cụm cũ của bạn vẫn là một phần của nó, bạn có thể vẫn nhận được các tuyến cũ / trùng lặp.


3
Làm cách nào để kiểm tra xem đây có phải là vấn đề không?
Rn222

Đúng rồi. Nó đã xảy ra với dự án của tôi. Khi tôi thay đổi tên của nó, đã xảy ra lỗi này. Sau khi tháo lắp ráp cũ, lỗi đã biến mất.
bafsar

3

Trong trường hợp của tôi, tôi phải đối mặt với vấn đề này, khi tôi thêm tham chiếu đến một dự án khác từ giải pháp, cũng là MVC và sử dụng cùng tên trong khu vực (tôi không muốn thêm dự án này, tôi không biết nó xảy ra như thế nào ). Khi tôi loại bỏ DLL này, dự án bắt đầu hoạt động.


Tôi thậm chí còn không nghĩ rằng điều này có thể xảy ra, vì tôi luôn giữ các dự án trang web của mình khép kín thay vì chia nhỏ mọi thứ thành hàng tá mảnh "bởi vì kiến ​​trúc". Nhóm mới, quy ước mới, cơ hội mới để bổ sung một số tùy chọn mà tôi chưa thấy hữu ích.
brichins

2

Chỉ xóa các tệp DLL không hiệu quả với tôi (trong VS2013), nhưng xóa toàn bộ thư mục 'bin' và 'obj' rồi xây dựng giải pháp đã hoạt động hoàn hảo! Khiến tôi ước rằng mình đã không mất quá nhiều thời gian để sửa nó ...


1

Không có gợi ý nào phù hợp với tôi. Đã đi trước và khởi động lại máy chủ web (trong trường hợp này là IIS) và điều đó đã xóa lỗi sau khi tôi đã sửa mã. DLL phải được lưu trong IIS.


1

hãy thử mã này, chỉ thay đổi tên

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

Tôi đang nhận được cùng một lỗi. Nhưng cuối cùng tôi đã có giải pháp. Tình huống: Tôi đang thêm dll (ứng dụng mvc4) khác nhau trong ứng dụng mvc4 api web của mình. Khi cố gắng chạy. Tôi đang nhận được cùng một lỗi. Nguyên nhân gốc- Khi ứng dụng api web của tôi chạy .Ứng dụng đăng ký tất cả các khu vực từ bản thân và bắt đầu tải đến tham chiếu dll miền ứng dụng hiện tại. Khi ứng dụng tải dll (ứng dụng MVC4) lần đó gặp lỗi vì maproute hiện tại đã thêm khóa cho "HelpPage_Default".

Giải pháp. 1. Thay đổi khóa cho RegisterArea trong bản đồ định tuyến ứng dụng hiện tại hoặc ứng dụng hiện có (Tham khảo dll). 2. Di chuyển mã dll (ứng dụng mvc4) sang mã tự do khác và tham chiếu đến dll mới.


0

Tôi đã gọi thủ công AttributeRoutingHttpConfig.Start()trong Global.asax của mình. Không nhận thấy dòng được tạo tự động này ở đầu tệp tự động gọi nó.

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

0

Tôi có một ứng dụng là ứng dụng Biểu mẫu được di chuyển sang MVC với thành phần bên thứ ba được sử dụng để xác thực được chuyển hướng đến một trang web khác. Thành phần sẽ bắt đầu một phiên hai lần nếu người dùng chưa đăng nhập (một lần cho kết nối ban đầu với trang web và một lần để quay lại). Vì vậy, tôi đã giải quyết vấn đề này bằng đoạn mã sau:

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

Xóa các hình nền trong thư mục bin đã hoạt động 100%, tôi vẫn còn các hình ảnh dự án của mình cần phải xây dựng lại. Thay vì tạo một bản sao của thư mục bin. sau đó xóa bản gốc. xây dựng lại dự án. nếu nó không thành công, hãy đặt các viên bột bị thiếu vào thư mục bin.


0

Tôi đang chạy một trang web MVC2 cũ và tôi gặp sự cố này vì 'Chế độ đường ống được quản lý' của IIS được đặt trên 'Tích hợp' theo mặc định (nhấn F4 trên dự án). Thay đổi nó thành 'Cổ điển' đã khắc phục sự cố


0

Khi xuất bản lên Azure App Service, tôi phải kiểm tra "Cài đặt" của Hộp thoại Xuất bản -> "Tùy chọn Xuất bản Tệp" -> "Xóa tệp bổ sung tại đích" để xóa tệp DLL và tệp biểu tượng cũ của dự án. Sau đó, trang web sẽ tải.

Đây thực chất là giải pháp cốt lõi của câu trả lời hiện tại (Bọ chét). Xóa DLL vi phạm.

Điều khiến DLL cũ này được giữ lại là tôi đang tải phiên bản cũ hơn của trang web (mẫu MVC 3 ~ 5 nhưng dự án web khác với không gian tên xung đột, vì phiên bản mới hơn là bản sao của dự án này đã thực hiện một số điểm trong quá khứ gần đây. ) Các tệp DLL của dự án mới hơn chỉ cần được xóa. Có nhiều cách khác nhau để đạt được điều này. Tôi thấy sử dụng hộp thoại là cách dễ dàng nhất. Đăng nhập vào hệ thống tệp và xử lý tệp bằng tay chắc chắn cũng hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.