Маршрут с именем " 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:inetpubwwwrootSchemaBrowserServiceWebsiteAreasApiApiAreaRegistration.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:inetpubwwwrootSchemaBrowserServiceWebsiteAreasApiApiAreaRegistration.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:UsersdjacksonDownloadsRestApiMvc3WebsiteWebsiteGlobal.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 }
);

}
}
671   12  

12 ответов:

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

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

метод Application_Start в Global.асакс.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);
}

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

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

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

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

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

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

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

решение. 1.Изменить ключ для RegisterArea в maproute либо текущего приложения или существующего приложения(см. dll). 2.Переместите код dll (приложение mvc4) в другой liberary и обратитесь к новой dll.

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

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

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

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

я запускал старый веб-сайт MVC2, и я получил эту проблему, потому что режим управляемого конвейера IIS был установлен на "интегрированный" по умолчанию (нажмите F4 в проекте). Изменение его на "классический" Исправлена проблема

Comments

    Ничего не найдено.