이름이 "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이 정리되지 않았습니다.때때로 최신 버전의 DLL만 사용되어 사이트가 올바르게 작동할 수 있는 것처럼 보이지만, 결국 두 가지 모두 로드되어 경로 충돌이 발생합니다.
경로는 AppDomain 내의 모든 어셈블리에서 로드됩니다.CurrentDomain. 따라서 이전 어셈블리가 여전히 그 일부인 경우 이전/중복 경로가 계속 생성될 수 있습니다.
저의 경우, 솔루션의 다른 프로젝트에 대한 참조를 추가했을 때 이 문제가 발생했습니다. MVC이기도 하고 영역에서 동일한 이름을 사용했습니다(이 프로젝트를 추가하고 싶지 않았기 때문에 어떻게 된 일인지 모르겠습니다).이 DLL을 제거하자 프로젝트가 작동하기 시작했습니다.
DLL을 삭제하는 것만으로는 효과가 없었지만(VS2013에서는) 전체 'bin' 및 'obj' 폴더를 삭제한 다음 솔루션을 구축하는 것이 완벽하게 효과가 있었습니다!고치기 위해 그렇게 오래 걸리지 않았으면 좋았을 텐데 하는 생각나네요.
어떤 제안도 저에게 효과가 없었습니다.먼저 웹 서버(이 경우는 IIS)를 다시 시작했고 코드를 수정한 후 오류를 해결했습니다.DLL이 IIS에 캐시되어 있어야 합니다.
이 코드를 사용해 보십시오. 이름만 변경하십시오.
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" }
);
저도 같은 오류가 발생하고 있습니다.하지만 마침내 해결책을 찾았습니다.시나리오:나의 웹 api mvc4 애플리케이션에 다른(mvc4 애플리케이션) dll을 추가합니다.뛰려고 할 때.저도 같은 오류가 발생하고 있습니다.근본 원인 - 웹 API 응용 프로그램이 실행될 때입니다.응용 프로그램이 모든 영역을 자체에서 현재 응용 프로그램 도메인 dll 참조로 로드하기 시작합니다.현재 맵 경로가 "HelpPage_Default"에 대한 키를 이미 추가했기 때문에 응용 프로그램 dll(MVC4 응용 프로그램)을 로드할 때 오류가 발생합니다.
해결책. 1.현재 응용프로그램 또는 기존 응용프로그램에서 지도 경로의 RegisterArea 키를 변경합니다(dll 참조).2. 코드 dll(mvc4 애플리케이션) 코드를 다른 liberary로 이동하고 새 dll을 참조합니다.
수동으로 전화를 걸었습니다.AttributeRoutingHttpConfig.Start()
나에 Global.asax 서의.자동으로 호출하는 파일의 맨 위에 이 자동 생성된 줄이 있는지 몰랐습니다.
[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
다른 사이트로 리디렉션된 인증에 사용되는 타사 구성 요소를 사용하여 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}
);
}
bin 폴더에서 dll을 삭제하는 것은 100% 효과가 있었습니다. 저는 여전히 제 프로젝트를 재구축해야 했습니다.차라리 bin 폴더를 복사하세요.그런 다음 원본을 삭제합니다.실패하면 누락된 dll을 bin 폴더에 넣습니다.
이전 MVC2 웹사이트를 운영하고 있었는데 IIS 'Managed Pipeline Mode'가 기본적으로 'Integrated'로 설정되어 있어서 이 문제가 발생했습니다(프로젝트에서 F4를 누릅니다).'Classic'으로 변경하여 문제를 해결
Azure App Service에 게시할 때 이전 프로젝트 DLL 및 기호 파일을 제거하려면 게시 대화 상자의 "설정"->"파일 게시 옵션"->"대상에서 추가 파일 제거"를 확인해야 했습니다.그러면 사이트가 로드됩니다.
이것은 본질적으로 핵심적인 현재 답변(플리즈) 솔루션입니다.문제가 있는 DLL을 삭제합니다.
이 오래된 DLL이 유지된 이유는 이전 버전의 웹 사이트를 로드하고 있었기 때문입니다(MVC 3~5개의 템플릿과 충돌하는 이름 공간이 있는 다른 웹 프로젝트). 새 버전은 최근에 이 프로젝트의 일부 복사본이었기 때문입니다.새 프로젝트의 DLL을 삭제하기만 하면 됩니다.이를 달성하기 위한 다양한 방법이 있습니다.저는 대화를 사용하는 것이 가장 쉬운 방법이라는 것을 알았습니다.파일 시스템에 로그인하고 파일을 손으로 축 처리하는 것도 확실히 효과적입니다.
만약 당신이 버전을 만들고 있고 같은 이름을 가진 두 개의 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/http/2020?api-version=1.1
이 문제에 직면했습니다.제 프로젝트에 영역을 추가한 후 문제가 발생했습니다.에 대한 요구가 있었습니다.MapMvcAttributeRoutes()
에RegisterArea()
방법.따라서 중복된 경로 이름을 찾지 말고 중복된 경로 이름을 찾으십시오.MapMvcAttributeRoutes()
전화가 걸려오는 전화.
언급URL : https://stackoverflow.com/questions/10986909/a-route-named-x-is-already-in-the-route-collection-route-names-must-be-unique
'bestsource' 카테고리의 다른 글
bash 별칭 명령(단일 따옴표와 이중 따옴표 모두 포함) (0) | 2023.05.04 |
---|---|
Xcode 6 iPhone Simulator 응용 프로그램 지원 위치 (0) | 2023.05.04 |
셸 스크립트의 변수에 명령을 저장하려면 어떻게 해야 합니까? (0) | 2023.05.04 |
Angular 2에서 추가 요소 없이 ngIf 사용 (0) | 2023.05.04 |
데이터베이스(예: SQL Server)에 트랜잭션을 커밋하지 않으면 어떻게 됩니까? (0) | 2023.05.04 |