Маршрут с именем "x" уже находится в коллекции маршрутов. Имена маршрутов должны быть уникальными. Исключение с ASP.NET MVC 3

Я занимаюсь веб-службой 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 }
        );

    }
}

Ответ 1

Чтобы устранить эту проблему, мне пришлось зайти в папку bin в моем проекте, удалить все файлы DLL, а затем перестроить, и это устранило проблему.

Ответ 2

Эта ошибка может возникнуть из-за нескольких причин, я имел ту же ошибку и решил ее, изменив класс 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);
}

Это не может быть ответом на вашу проблему, но может помочь другим в будущем. Я не видел этого ответа между другими, поэтому я решил добавить это.

Ответ 3

Я узнал, что Global.asax ссылался на старую версию файла DLL сайта, прежде чем переименовать его. DLL не очищалась, когда я делал Build > Clean, потому что VS project/solution больше не ссылался на него. Похоже, что иногда использовалась только более новая версия DLL, позволяющая сайту работать правильно, но в конечном итоге оба они были бы загружены, что вызвало бы конфликты маршрута.

Ответ 4

Маршруты загружаются из всех сборок внутри AppDomain.CurrentDomain, поэтому, если ваши старые сборки все еще являются частью этого, вы все равно можете получать старые/дублированные маршруты.

Ответ 5

Удаление только DLL файлов не помогло мне (в VS2013), но удалило все папки "bin" и "obj", а затем построило решение отлично! Заставляет меня жаль, что я так долго не пытался его исправить...

Ответ 6

В моем случае я столкнулся с этой проблемой, когда я добавил ссылку на другой проект из решения, который также был MVC и использовал те же имена в области (я не хотел добавлять этот проект, я не знаю как это произошло). Когда я удалил эту DLL, проект начал работать.

Ответ 7

Я получаю такую ​​же ошибку. Но, наконец, у меня есть решение. Сценарий: я добавляю другую (mvc4 application) dll в приложение для веб-api mvc4. Когда пытаетесь запустить. Я получаю такую ​​же ошибку. Корневая причина. Когда приложение веб-приложения api запускается. Привязка регистрирует всю область с самого себя и начинает загрузку в текущие ссылки на dll текущего приложения. Когда приложение load dll (приложение MVC4) получает время, потому что текущий maproute уже добавляет ключ для "HelpPage_Default".

Решение. 1.Выберите ключ для RegisterArea в макете текущего приложения или существующего приложения (см. Dll). 2. Передвиньте код dll (приложение mvc4) на другой libary и обратитесь к новой dll.

Ответ 8

Я вручную вызывал AttributeRoutingHttpConfig.Start() в свой Global.asax. Не заметил эту автоматически сгенерированную строку в верхней части файла, который автоматически вызывает ее.

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

Ответ 9

У меня было приложение, которое было перенесено в приложение 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}
                    );
            }

Ответ 10

Удаление DLL в папке bin работало на 100%, у меня все еще были dll, которые мне нужен для восстановления моего проекта. Скорее сделайте копию папки bin. затем удалите исходный проект. если это не удается, поместите отсутствующие DLL в папку bin.