名为“ x”的路由已经在路由集合中。路由名称必须唯一。ASP.NET MVC 3的例外


98

我正在做一个ASP.NET MVC 3 Web服务,并且我不断断断续续地收到此异常。

堆栈跟踪:

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 }
        );

    }
}

您是否定义了路线的其他地方?地区?
Shyju 2012年

我添加了堆栈跟踪并添加了有关我的路线的其他信息。
Rn222

Answers:


297

要解决此问题,我必须进入项目的bin文件夹,删除所有DLL文件,然后重新生成,从而解决了该问题。


11
只需清洁溶液,我们就可以做同样的事情。
Fabio Milheiro

84
@Bomboca-清理不会删除不属于项目的DLL。例如,如果您更改了项目的程序集名称,则旧程序集将保留在该bin文件夹中。
乔什·

2
我遇到了同样的问题,这立即解决了我的问题。谢谢!
Aluan Haddad 2014年

1
重命名我的项目,并且旧的DLL仍然在bin文件夹中。请人们:永久解决方案,当发布时,请首先删除目标目录中的所有文件!(发布到目录时的选项)
StijnSpijker 2014年

2
我不知道为什么,但是“清洁解决方案”对我不起作用。您的解决方案有效。
user2980426'6

19

可能由于多种原因导致此错误,我遇到了相同的错误,并通过修改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);
}

这可能不是您问题的答案,但将来可能会帮助其他人。我没有在其他人之间看到这个答案,所以我决定添加这个。


2
也有对AreaRegistration.RegisterAllAreas()的重复调用。
Spivonious 2015年

另外,我遇​​到了这个问题:WebApiConfig.Register(GlobalConfiguration.Configuration); 与GlobalConfiguration.Configure(WebApiConfig.Register); 两者都在WebApiConfig.cs中调用相同的方法。技巧当然是在设置路由名称的地方休息一下,然后看一下调用堆栈。
Reid

我遇到了此错误,其他解决方案都对我不起作用,但是后来我发现重复的AreaRegistration.RegisterAllAreas();。我的global.asax文件中的行。删除其中之一可以消除错误。
ewomack,

10

我发现Global.asax在重命名之前是指站点DLL文件的旧版本。当我执行“构建”>“清理”时,没有清理DLL,因为VS项目/解决方案不再引用它。似乎有时只使用了较新版本的DLL,从而使站点可以正常工作,但最终它们都将被加载,从而导致路由冲突。


重命名项目后,删除bin和obj对我有用。
2014年

3
您如何找到Global.asax所指的是旧的DLL?
xaisoft

@xiasoft:旧的DLL包含我已删除的路由,但Route Debugger显示它们仍然存在。当我删除旧的DLL时,旧的路由也被删除了。
Rn222

4

路由是从AppDomain.CurrentDomain中的所有程序集加载的,因此,如果您的旧程序集仍是其中的一部分,则可能仍会获得旧的/重复的路由。


3
我如何检查这是否是问题所在?
Rn222

那就对了。它发生在我的项目上。当我更改它的名称时,发生此错误。删除旧程序集后,错误消失了。
bafsar

3

就我而言,我遇到了这个问题,当我从解决方案中添加对另一个项目的引用时,该项目也是MVC并在区域中使用相同的名称(我不想添加此项目,我不知道它是如何发生的)。当我删除此DLL时,项目开始工作。


我什至没有想到会发生这种情况,因为我一直使站点项目保持独立,而不是因为“由于体系结构”而将事情分成十几个部分。新的团队,新的约定,新的机会,可以将我尚未发现有用的某些选项内部化。
brichins

2

单独删除DLL对我来说不起作用(在VS2013中),但是删除整个'bin'和'obj'文件夹,然后构建解决方案就可以了!让我希望我花了这么长时间来修复它...


1

没有任何建议对我有用。继续并重新启动了Web服务器(在本例中为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

我收到同样的错误。但是最后我有了解决方案。场景:我在我的Web api mvc4应用程序中添加了不同的(mvc4应用程序)dll。何时尝试运行。我收到同样的错误。根本原因-当我的Web api应用程序运行.Application时,将从self中注册所有区域并开始加载到当前应用程序域dll引用。当应用程序加载dll(MVC4应用程序)时,由于当前maproute已为“ HelpPage_Default”添加了键,因此出现错误。

解。1.在当前应用程序或现有应用程序中更改Maproute中RegisterArea的键(请参阅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

删除bin文件夹中的dll确实可以100%工作,但我仍然需要重建项目的dll。而是制作bin文件夹的副本。然后删除原始文件。重建项目。如果失败,将丢失的dll放入bin文件夹。


0

我正在运行一个旧的MVC2网站,但出现此问题是因为IIS的“托管管道模式”默认情况下设置为“集成”(在项目上按F4)。将其更改为“经典”可解决此问题


0

发布到Azure App Service时,我必须检查“发布”对话框的“设置”->“文件发布选项”->“在目标位置删除其他文件”,以删除旧的项目DLL和符号文件。然后该站点将加载。

从本质上讲,这是当前答案(跳蚤)的核心。删除有问题的DLL。

导致保留此旧DLL的原因是,我正在加载旧版本的网站(MVC 3〜5模板,但具有冲突的名称空间的其他Web项目),因为新版本是该项目的副本,这在最近很有意义。 )只需删除较新项目的DLL。有多种方法可以实现此目的。我发现使用对话框是最简单的atm。当然,登录文件系统并手动更改文件也可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.