名为“x”的路由已经在路由集合中。 路由名称必须是唯一的。 ASP.NET MVC 3的exception
我正在做一个ASP.NET MVC 3的Web服务,我不断得到这个exception。
堆栈跟踪:
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显示我已经修改或删除了一些旧的路由并且不会消失(即使重新启动我的机器之后)有关。 堆栈跟踪也是指一个早已被删除的源文件,我的应用程序已经被移动到一个新的位置,从那时起被清理和重build。 我错过了什么?
这里是我所有的路线注册码:
// 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文件,然后重build,这解决了这个问题。
这个错误可能由于多个原因而发生,我有相同的错误并通过修改Global.asax类来解决它。
Global.asax.cs中的Application_Start方法如下所示:
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); }
这可能不是你的问题的答案,但也许可以帮助其他人在未来。 我没有看到其他人之间的这个答案,所以我决定添加这个。
我发现Global.asax指的是旧版本的网站的DLL文件,我重命名之前。 由于VS项目/解决scheme没有再提及,所以当我进行Build> Clean时,DLL没有被清理。 似乎有时只使用较新版本的DLL,允许网站正常工作,但最终他们将被加载导致路由冲突。
路由从AppDomain.CurrentDomain中的所有程序集中加载,因此如果您的旧程序集仍然是其中的一部分,那么您可能仍然会收到旧的/重复的路由。
单独删除DLL对我来说不起作用(在VS2013中),但是删除整个“bin”和“obj”文件夹,然后构build解决scheme就完美了! 让我希望我没有花太多时间试图修复它…
在我的情况下,我遇到了这个问题,当我添加了从解决scheme,也是MVC的其他项目的引用,并在地区使用相同的名称(我不想添加这个项目,我不知道它是如何发生的)。 当我删除这个DLL时,项目开始工作。
我得到同样的错误。 但最后我有解决scheme。 场景:我在我的web api mvc4应用程序中添加不同的(mvc4应用程序)dll。 当试图运行。 我得到同样的错误。 根本原因 – 当我的web api应用程序运行。应用程序注册自己的所有区域,并开始加载到当前应用程序域的dll引用。 当应用程序加载dll(MVC4应用程序)时,由于当前maproute已经添加了“HelpPage_Default”的关键错误。
解。 1.在当前应用程序或现有应用程序(请参阅dll)中,更改MapArea中的RegisterArea的键。 2.移动代码dll(mvc4应用程序)代码到不同的自由和参考新的dll。
我手动调用Global.asax中的AttributeRoutingHttpConfig.Start()
。 没有注意到这个自动生成的行在自动调用它的文件的顶部。
[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
我有一个应用程序是一个Forms应用程序迁移到MVC与第三方组件用于身份validationredirect到另一个网站。 如果用户尚未login(一次用于初始连接到站点,一次用于返回),组件将启动会话两次。 所以我用下面的代码解决了这个问题:
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} ); }
删除bin文件夹中的dll确实工作100%,我仍然有我的项目需要重build的DLL。 而是做一个bin文件夹的副本。 然后删除original.rebuild该项目。 如果失败,将缺less的dll放入bin文件夹。