[asp.net] “x”라는 이름의 경로가 이미 경로 모음에 있습니다. 경로 이름은 고유해야합니다. ASP.NET MVC 3의 예외

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 파일을 삭제 한 다음 다시 빌드해야했습니다.


답변

이 오류는 여러 원인으로 인해 발생할 수 있으며 동일한 오류가 발생하여 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 프로젝트 / 솔루션이 더 이상 참조하지 않았기 때문에 빌드> 정리를 수행 할 때 DLL이 정리되지 않았습니다. 때로는 최신 버전의 DLL 만 사용되어 사이트가 올바르게 작동하지만 결국에는 둘 다로드되어 경로 충돌이 발생하는 것 같습니다.


답변

경로는 AppDomain.CurrentDomain 내의 모든 어셈블리에서로드되므로 이전 어셈블리가 여전히 그 일부인 경우 이전 / 중복 경로를 가져올 수 있습니다.


답변

제 경우에는 솔루션에서 다른 프로젝트에 대한 참조를 추가했을 때이 문제에 직면했습니다. MVC이기도하고 영역에서 동일한 이름을 사용합니다 (이 프로젝트를 추가하고 싶지 않았는데 어떻게되었는지 모르겠습니다.) ). 이 DLL을 제거하면 프로젝트가 작동하기 시작했습니다.


답변

DLL을 삭제하는 것만으로는 효과가 없었지만 (VS2013에서는) 전체 ‘bin’및 ‘obj’폴더를 삭제 한 다음 솔루션을 빌드하는 것이 완벽하게 작동했습니다! 내가 그것을 고치려고 너무 오래 보내지 않았 으면 좋겠다 …


답변

어떤 제안도 나를 위해 일하지 않았습니다. 계속해서 웹 서버 (이 경우에는 IIS)를 다시 시작했으며 코드를 수정 한 후 오류가 해결되었습니다. DLL은 IIS에 캐시되어 있어야합니다.