Маршрут з назвою "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

Це, мабуть, пов'язано з тим, що налагоджувач маршруту показує, що у мене є старі маршрути, які я змінив або видалив і не вийду (навіть після перезавантаження машини). Трасування стека також посилається на вихідний файл, який давно видалено, і мою програму було перенесено на нове місце, очищено та відновлено з того часу. Що я пропускаю?

Ось мій код реєстрації маршруту:

// 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
Просто очищаючи розчин, ми робимо те саме.
Фабіо Мілхейро

84
@Bomboca - прибирання не видаляє DLL, які не є частиною проекту. Наприклад, якщо ви змінили назву складання вашого проекту, стара збірка залишиться у binпапці.
Джош М.

2
У мене виникло те саме питання, і це негайно вирішило мою проблему. Дякую!
Алуан Хаддад

1
Перейменовано мій проект, і стара DLL все ще знаходилася в папці bin. Будь ласка, люди: постійне рішення, коли ВИДАВЛЯЄТЬСЯ, спочатку видаліть усі файли з цільового каталогу! (опція при публікації в каталозі)
StijnSpijker

2
Я не знаю чому, але "Чисте рішення" не працює для мене. Ваше рішення працює.
користувач2980426

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. Трюк, звичайно, повинен зробити перерву, де встановлюється назва маршруту, і подивитися на стек виклику.
Рейд

Я отримував цю помилку, і жодне з інших рішень не працювало для мене, але потім я знайшов повторюваний AreaRegistration.RegisterAllAreas (); рядки у моєму файлі global.asax. Видаливши одну з них, помилка виникла.
ewomack

10

Я дізнався, що Global.asax посилався на стару версію файлу DLL сайту, перш ніж перейменувати його. DLL не очищався, коли я робив Build> Cleanst, тому що проект / рішення VS вже не посилалися на нього. Здається, іноді використовувалася лише нова версія DLL, що дозволяє сайту працювати коректно, але з часом вони будуть завантажені, викликаючи конфлікти маршруту.


видалення біна та obj працювало для мене після перейменування мого проекту.
Стів

3
Як ви дізналися, що Global.asax мав на увазі стару DLL?
xaisoft

@xiasoft: Стара DLL містила маршрути, які я видалив, але налагоджувач маршруту показав, що вони все ще є. Коли я видалив стару DLL, старі маршрути також були видалені.
Rn222

4

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


3
Як я міг перевірити, чи не в цьому проблема?
Rn222

Це вірно. Це трапляється на моєму проекті. Коли я змінив ім'я, сталася ця помилка. Після видалення старої збірки помилка пішла.
бафсар

3

У моєму випадку я зіткнувся з цим питанням, коли додав посилання на інший проект із рішення, який також був MVC та використовував ті самі назви в області (я не хотів додавати цей проект, я не знаю, як це сталося ). Коли я видалив цю DLL, проект почав працювати.


Мені навіть не прийшло в голову, що це може статися, оскільки я завжди тримав проекти своїх сайтів самостійними, а не розбивав речі на десяток штук "через архітектуру". Нова команда, нові конвенції, нові шанси втілити деякі варіанти, які я досі не знайшов корисними.
бричін

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

Я отримую таку ж помилку. Але нарешті я отримав рішення. Сценарій: я додаю різні (mvc4 додаток) dll у свою веб-програму api mvc4. Коли намагаються бігти. Я отримую таку ж помилку. Причина Root - Коли запускається мій веб-додаток api. Додаток зареєструє всю область від самості та запустить завантаження до поточних посилань на dll домену додатків. Коли програма завантажує dll (додаток MVC4), цей час виникає помилка, оскільки поточна карта картки вже додає ключ для "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

Видалення dlls у папці bin спрацювало на 100%, у мене все ще були dlls, які мій проект потребував для відновлення. Скоріше скопіюйте копію папки. потім видаліть original.rebuild проект. якщо це не вдається, помістіть відсутні папки в папку бін.


0

Я запускав старий веб-сайт MVC2, і у мене виникла ця проблема, оскільки режим IIS "Керований конвеєрний трубопровід" був встановлений на "Інтегрований" за замовчуванням (натисніть F4 в проекті). Змінивши його на "Класичний", виправлено проблему


0

Під час публікації в службі додатків Azure мені довелося перевірити "Налаштування" -> "Параметри публікації файлів" -> "Видалити додаткові файли за призначенням" у діалоговому вікні "Опублікувати файли", щоб видалити старий DLL проекту та файли символів. Тоді сайт завантажиться.

Це по суті поточне рішення відповідей (Флоас) в основі. Видаліть образливу DLL.

Що спричинило збереження цієї старої DLL - це те, що я завантажував старішу версію веб-сайту (шаблони MVC 3 ~ 5, але різні веб-проекти із зіткненнями просторів імен, оскільки новіша версія була копією цього проекту, яка мала певний момент у недавньому минулому. ) Нові DLL-файли проекту просто потрібно було видалити. Існують різні способи досягнення цього. Я знайшов використання діалогового вікна найпростішим атм. Увійти до файлової системи та ділитися файлами вручну, безумовно, теж працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.