Маршрут с именем «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 }
        );

    }
}
Rn222
источник
У вас есть другое место, где вы определили маршруты? Области?
Shyju
Я добавил трассировку стека и добавил дополнительную информацию о своих маршрутах.
Rn222

Ответы:

297

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

Блоха
источник
11
Просто очищая раствор, мы делаем то же самое.
Фабио Мильейро,
84
@Bomboca - очистка не удаляет библиотеки DLL, которые не являются частью проекта. Например, если вы изменили имя сборки проекта, старая сборка останется в binпапке.
Джош М.
2
У меня возникла та же проблема, и это сразу же решило мою проблему. Спасибо!
Алуан Хаддад
1
Мой проект был переименован, а старая DLL все еще находилась в папке bin. Пожалуйста, люди: постоянное решение, когда ПУБЛИКАЦИЯ, сначала удалите все файлы в целевом каталоге! (опция при публикации в каталог)
StijnSpijker
2
Не знаю почему, но «Чистое решение» мне не подходит. Ваше решение работает.
user2980426 06
19

Эта ошибка может возникать по нескольким причинам. У меня была такая же ошибка, и я решил ее, изменив класс 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 02
10

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

Rn222
источник
удаление bin и obj сработало для меня после переименования моего проекта.
Стив
3
Как вы узнали, что Global.asax имел в виду старую DLL?
xaisoft
@xiasoft: старая DLL содержала маршруты, которые я удалил, но Route Debugger показал, что они все еще там. Когда я удалил старую DLL, старые маршруты также были удалены.
Rn222
4

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

Филип В
источник
3
Как я могу проверить, не в этом ли проблема?
Rn222
Это правильно. Это случилось с моим проектом. Когда я изменил его имя, произошла эта ошибка. После удаления старой сборки ошибка ушла.
bafsar
3

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

DreamEvil
источник
Мне даже не приходило в голову, что это могло произойти, поскольку я всегда держал свои проекты сайтов самодостаточными, вместо того, чтобы разбивать их на дюжину частей «из-за архитектуры». Новая команда, новые соглашения, новые возможности усвоить некоторые из вариантов, которые я еще не нашел полезными.
brichins
2

Удаление только библиотек DLL не помогло мне (в VS2013), но удаление всех папок bin и obj и последующее построение решения сработали отлично! Заставляет меня пожалеть, что я так долго не пытался это исправить ...

Lyall
источник
1

Ни одно из предложений у меня не сработало. Пошел дальше и перезапустил веб-сервер (в данном случае IIS), и это устранило ошибку после того, как я исправил код. DLL должна быть кэширована в IIS.

joel1618
источник
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

Я получаю такую ​​же ошибку. Но наконец у меня есть решение. Сценарий: я добавляю другую (приложение mvc4) dll в свое приложение mvc4 web api. Когда пытаешься бежать. Я получаю такую ​​же ошибку. Основная причина - когда мое приложение веб-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")]
Despertar
источник
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}
                    );
            }

done_merson
источник
0

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

Терри Мосома
источник
0

У меня был старый веб-сайт MVC2, и эта проблема возникла из-за того, что для IIS «Managed Pipeline Mode» по умолчанию было установлено значение «Integrated» (нажмите F4 в проекте). Изменение его на «Классический» устранило проблему.

Phate01
источник
0

При публикации в службе приложений Azure мне пришлось проверить диалоговое окно «Параметры» -> «Параметры публикации файлов» -> «Удалить дополнительные файлы в месте назначения», чтобы удалить старые DLL проекта и файлы символов. Тогда сайт загрузится.

Это, по сути, текущее решение (блох) в основе. Удалите вредоносную DLL.

Эта старая DLL была сохранена, потому что я загружал старую версию веб-сайта (шаблоны MVC 3 ~ 5, но другой веб-проект с конфликтующими пространствами имен, поскольку новая версия была копией этого проекта, сделанного в недавнем прошлом. ) Библиотеки DLL нового проекта просто нужно было удалить. Есть разные способы добиться этого. Я обнаружил, что проще всего использовать диалог. Вход в файловую систему и удаление файлов вручную тоже работает.

Охотник-Орионнуар
источник