101

我正在做一个 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 }
        );

    }
}
4

16 回答 16

304

要解决这个问题,我必须进入项目的 bin 文件夹,删除所有 DLL 文件,然后重新构建,这解决了问题。

于 2012-08-14T19:36:43.900 回答
21

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

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

于 2014-06-12T08:37:12.723 回答
11

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

于 2012-06-12T13:18:13.340 回答
5

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

于 2012-06-11T20:57:45.517 回答
3

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

于 2016-08-12T13:30:25.590 回答
2

单独删除 DLL 对我不起作用(在 VS2013 中),但删除整个 'bin' 和 'obj' 文件夹然后构建解决方案效果很好!让我希望我没有花这么长时间试图修复它......

于 2015-10-01T08:32:56.527 回答
2

没有任何建议对我有用。继续并重新启动 Web 服务器(在本例中为 IIS),并在我修复代码后清除了错误。DLL 必须已缓存在 IIS 中。

于 2018-05-03T21:29:31.077 回答
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" }
      );
于 2018-11-02T06:41:42.647 回答
0

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

解决方案。1.更改maproute中RegisterArea的键,无论是当前应用程序还是现有应用程序(参考dll)。2.将代码dll(mvc4应用程序)代码移动到不同的库并引用新的dll。

于 2014-03-12T12:12:15.857 回答
0

我手动调用AttributeRoutingHttpConfig.Start()了我的 Global.asax。没有注意到自动调用它的文件顶部的这个自动生成的行。

[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
于 2014-09-21T08:18:28.107 回答
0

我有一个应用程序,它是一个迁移到 MVC 的 Forms 应用程序,其中包含用于身份验证的第三方组件,该组件重定向到另一个站点。如果用户尚未登录,该组件将启动会话两次(一次用于初始连接到站点,一次用于返回)。所以我用下面的代码解决了这个问题:

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

于 2015-07-17T15:36:27.010 回答
0

删除 bin 文件夹中的 dll 确实 100% 有效,我仍然有我的项目需要重建的 dll。而是制作 bin 文件夹的副本。然后删除 original.rebuild 项目。如果失败,请将丢失的 dll 放入 bin 文件夹中。

于 2015-11-26T06:05:19.917 回答
0

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

于 2018-09-13T08:24:11.747 回答
0

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

这本质上是核心的当前答案(跳蚤)解决方案。删除有问题的 DLL。

导致这个旧 DLL 被保留的原因是我正在加载旧版本的网站(MVC 3~5 模板,但不同的 web 项目具有冲突的命名空间,因为新版本是该项目的副本,这在最近有一些意义。 ) 只需要删除较新项目的 DLL。有多种方法可以实现这一目标。我发现使用对话框是最简单的自动取款机。登录文件系统并手动删除文件当然也可以。

于 2019-10-30T21:59:47.807 回答
0

如果您在进行版本控制,并且使用了两个同名的 API,您将收到此错误。如果您需要相同的 Get,请尝试更改路由的 Name 属性:

测试控制器.cs:

      [MapToApiVersion("1.0")]
      [Route("{moniker}", Name = "GetTest")]
      public async Task<IHttpActionResult> Get(string moniker, bool param1 = false)

  [MapToApiVersion("1.1")]
  [Route("{moniker}", Name = "GetTest11")] // Change name here for a different version
  public async Task<IHttpActionResult> Get(string moniker)

并在 URL 中传入版本:

http://localhost:6600/api/tests/2020?api-version=1.1

于 2020-10-08T19:54:27.987 回答
0

面临这个问题。向我的项目添加区域后出现问题。有人要求MapMvcAttributeRoutes()inRegisterArea()方法。因此,您不应该寻找重复的路由名称,只需寻找重复的MapMvcAttributeRoutes()调用。

于 2020-10-26T23:22:53.287 回答