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


98

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

    }
}

경로를 정의한 다른 장소가 있습니까? 지역?
Shyju 2011-06-11

스택 추적을 추가하고 경로에 대한 추가 정보를 추가했습니다.
Rn222

답변:


297

이 문제를 해결하기 위해 프로젝트의 bin 폴더로 이동하여 모든 DLL 파일을 삭제 한 다음 다시 빌드해야했습니다.


11
솔루션을 청소하는 것만으로도 동일한 작업을 수행합니다.
Fabio Milheiro

84
@Bomboca-정리는 프로젝트의 일부가 아닌 DLL을 삭제하지 않습니다. 예를 들어 프로젝트의 어셈블리 이름을 변경 한 경우 이전 어셈블리는 bin폴더에 남아 있습니다 .
Josh M.

2
나는 같은 문제를 겪고 있었고 이것은 내 문제를 즉시 해결했습니다. 감사합니다!
Aluan Haddad 2014

1
내 프로젝트의 이름이 바뀌었고 이전 DLL은 여전히 ​​bin 폴더에있었습니다. 사람들을 부탁드립니다 : 영구적 인 해결책, 게시 할 때 먼저 대상 디렉토리의 모든 파일을 삭제하십시오! (디렉토리에 게시 할 때 옵션)
StijnSpijker 2014-09-30

2
이유는 모르겠지만 "클린 솔루션"이 작동하지 않습니다. 솔루션이 작동합니다.
user2980426

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에서 동일한 메서드를 호출합니다. 트릭은 물론 경로 이름이 설정되는 곳에 휴식을 취하고 호출 스택을 살펴 보는 것입니다.
리드

이 오류가 발생하고 다른 솔루션이 저에게 효과가 없었지만 중복 된 AreaRegistration.RegisterAllAreas (); 내 global.asax 파일의 줄. 그중 하나를 제거하면 오류가 제거되었습니다.
ewomack

10

Global.asax가 이름을 변경하기 전에 이전 버전의 사이트 DLL 파일을 참조하고 있음을 알게되었습니다. VS 프로젝트 / 솔루션이 더 이상 참조하지 않았기 때문에 빌드> 정리를 수행 할 때 DLL이 정리되지 않았습니다. 때로는 최신 버전의 DLL 만 사용되어 사이트가 올바르게 작동하지만 결국에는 둘 다로드되어 경로 충돌이 발생하는 것 같습니다.


프로젝트 이름을 바꾼 후 bin과 obj를 삭제하면 저에게 효과적이었습니다.
Steve

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

어떤 제안도 나를 위해 일하지 않았습니다. 계속해서 웹 서버 (이 경우에는 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

같은 오류가 발생합니다. 그러나 마침내 해결책이 있습니다. 시나리오 : 웹 API mvc4 애플리케이션에 다른 (mvc4 애플리케이션) dll을 추가하고 있습니다. 실행하려고 할 때. 같은 오류가 발생합니다. 근본 원인-내 웹 API 응용 프로그램이 .Application을 실행할 때 자체에서 모든 영역을 등록하고 현재 응용 프로그램 도메인 dll 참조로로드를 시작합니다. 응용 프로그램이 dll (MVC4 응용 프로그램)을로드 할 때 현재 맵 경로가 이미 "HelpPage_Default"에 대한 키를 추가하기 때문에 오류가 발생합니다.

해결책. 1. 맵 루트의 RegisterArea 키를 현재 응용 프로그램 또는 기존 응용 프로그램 (dll 참조)으로 변경합니다. 2. code dll (mvc4 application) 코드를 다른 liberary로 이동하고 새로운 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 'Managed Pipeline Mode'가 기본적으로 'Integrated'로 설정되어 있기 때문에이 문제가 발생했습니다 (프로젝트에서 F4를 누르십시오). '클래식'으로 변경하면 문제가 해결되었습니다.


0

Azure App Service에 게시 할 때 이전 프로젝트 DLL 및 기호 파일을 제거하려면 게시 대화 상자의 "설정"-> "파일 게시 옵션"-> "대상에서 추가 파일 제거"를 확인해야했습니다. 그런 다음 사이트가로드됩니다.

이것은 본질적으로 핵심적인 현재 답변 (Fleas) 솔루션입니다. 문제가되는 DLL을 삭제합니다.

이 오래된 DLL이 유지되는 원인은 이전 버전의 웹 사이트 (MVC 3 ~ 5 템플릿이지만 충돌 네임 스페이스가있는 다른 웹 프로젝트)를로드하고 있었기 때문입니다. 최신 버전은 최근에이 프로젝트의 복사본이었던 것이기 때문입니다. ) 최신 프로젝트의 DLL을 삭제하면됩니다. 이를 달성하는 방법에는 여러 가지가 있습니다. 대화를 사용하는 것이 가장 쉬운 ATM이라는 것을 알았습니다. 파일 시스템에 로그인하고 수동으로 파일을 axing하는 것도 확실히 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.