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

时间:2012-06-11 20:13:55

标签: asp.net asp.net-mvc-3 asp.net-mvc-3-areas

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

这可能与路由调试器显示我有一些我修改或删除的旧路由并且不会消失(甚至在重新启动我的机器后)有关。堆栈跟踪还指一个源文件,该文件早已被删除,我的应用程序已移动到新位置,从那时起清理并重建。我错过了什么?

以下是我的所有路线注册码:

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

    }
}

16 个答案:

答案 0 :(得分:279)

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

答案 1 :(得分:16)

由于多种原因可能会发生此错误,我遇到了同样的错误,并通过修改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 :(得分:9)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

这些建议都不适合我。继续前进并重新启动Web服务器(在本例中为IIS),并在修复代码后清除了错误。 DLL必须已在IIS中缓存。

答案 7 :(得分:0)

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

添加了键,因此得到错误

解。 1.在maproute中为RegisterArea更改当前应用程序或现有应用程序(参考dll)。 2.将代码dll(mvc4应用程序)代码移动到不同的liberary并引用新的dll。

答案 8 :(得分:0)

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

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

答案 9 :(得分: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}
                    );
            }

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

尝试此代码,仅更改名称

Colegio.first.total_persons  # => the sum of the two columns

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

TestsController.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

答案 15 :(得分:0)

面对这个问题。在向我的项目添加区域后发生了问题。在MapMvcAttributeRoutes()方法中调用了RegisterArea()。因此,您不应查找重复的路由名称,而应查找重复的MapMvcAttributeRoutes()调用。