Я использую веб-службу 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 }
);
}
}
Ответы:
Чтобы решить эту проблему, мне пришлось зайти в папку bin в моем проекте, удалить все файлы DLL, а затем перестроить, и это устранило проблему.
источник
bin
папке.Эта ошибка может возникать по нескольким причинам. У меня была такая же ошибка, и я решил ее, изменив класс Global.asax.
Метод Application_Start в Global.asax.cs выглядел так:
Следующая строка встречается в этом методе дважды:
Это гарантировало, что маршрут был дважды добавлен в список маршрутов и в то же время вызвал ошибку.
Я изменил метод Application_Start следующим образом, и ошибка исчезла:
Возможно, это не ответ на вашу проблему, но, возможно, поможет другим в будущем. Я не видел этого ответа среди других, поэтому решил добавить это.
источник
Я узнал, что Global.asax имел в виду старую версию DLL-файла сайта, прежде чем я ее переименовал. DLL не очищалась, когда я делал Build> Clean up, потому что проект / решение VS больше не ссылались на него. Кажется, что иногда использовалась только более новая версия DLL, что позволяло сайту работать правильно, но в конечном итоге обе они загружались, вызывая конфликты маршрутов.
источник
Маршруты загружаются из всех сборок в AppDomain.CurrentDomain, поэтому, если ваши старые сборки все еще являются частью этого, вы все равно можете получать старые / повторяющиеся маршруты.
источник
В моем случае я столкнулся с этой проблемой, когда добавил ссылку на другой проект из решения, которое также было MVC и использовало те же имена в области (я не хотел добавлять этот проект, я не знаю, как это произошло ). Когда я удалил эту DLL, проект заработал.
источник
Удаление только библиотек DLL не помогло мне (в VS2013), но удаление всех папок bin и obj и последующее построение решения сработали отлично! Заставляет меня пожалеть, что я так долго не пытался это исправить ...
источник
Ни одно из предложений у меня не сработало. Пошел дальше и перезапустил веб-сервер (в данном случае IIS), и это устранило ошибку после того, как я исправил код. DLL должна быть кэширована в IIS.
источник
попробуйте этот код, только измените имя
источник
Я получаю такую же ошибку. Но наконец у меня есть решение. Сценарий: я добавляю другую (приложение mvc4) dll в свое приложение mvc4 web api. Когда пытаешься бежать. Я получаю такую же ошибку. Основная причина - когда мое приложение веб-API запускается. Приложение регистрирует всю область от себя и начинает загружаться в текущие ссылки dll домена приложения. Когда приложение загружает dll (приложение MVC4), появляется ошибка, потому что текущий maproute уже добавляет ключ для «HelpPage_Default».
Решение. 1. Измените ключ для RegisterArea в maproute в текущем или существующем приложении (см. Dll). 2. Переместите код dll (приложение mvc4) в другую библиотеку и обратитесь к новой dll.
источник
Я вручную звонил
AttributeRoutingHttpConfig.Start()
в свой Global.asax. Не заметил эту автоматически сгенерированную строку в верхней части файла, которая автоматически его вызывает.источник
У меня было приложение, представляющее собой приложение Forms, перенесенное на MVC со сторонним компонентом, используемым для аутентификации, который перенаправлялся на другой сайт. Компонент запускал сеанс дважды, если пользователь еще не вошел в систему (один раз для первоначального подключения к сайту и один раз для возврата). Итак, я решил это с помощью следующего кода:
источник
Удаление DLL в папке bin сработало на 100%, у меня все еще были библиотеки DLL, которые мой проект нужно было перестроить. Скорее сделайте копию папки bin. затем удалите оригинал. перестройте проект. если это не удается, поместите недостающие библиотеки DLL в папку bin.
источник
У меня был старый веб-сайт MVC2, и эта проблема возникла из-за того, что для IIS «Managed Pipeline Mode» по умолчанию было установлено значение «Integrated» (нажмите F4 в проекте). Изменение его на «Классический» устранило проблему.
источник
При публикации в службе приложений Azure мне пришлось проверить диалоговое окно «Параметры» -> «Параметры публикации файлов» -> «Удалить дополнительные файлы в месте назначения», чтобы удалить старые DLL проекта и файлы символов. Тогда сайт загрузится.
Это, по сути, текущее решение (блох) в основе. Удалите вредоносную DLL.
Эта старая DLL была сохранена, потому что я загружал старую версию веб-сайта (шаблоны MVC 3 ~ 5, но другой веб-проект с конфликтующими пространствами имен, поскольку новая версия была копией этого проекта, сделанного в недавнем прошлом. ) Библиотеки DLL нового проекта просто нужно было удалить. Есть разные способы добиться этого. Я обнаружил, что проще всего использовать диалог. Вход в файловую систему и удаление файлов вручную тоже работает.
источник