'Home'이라는 컨트롤러와 일치하는 여러 유형이 발견되었습니다.


318

현재 온라인으로 호스팅되는 두 개의 관련없는 MVC3 프로젝트가 있습니다.

하나는 잘 작동하고 다른 하나는 작동하지 않아 오류가 발생합니다.

'Home'이라는 컨트롤러와 일치하는 여러 유형이 발견되었습니다. 이 요청을 처리하는 경로 ( '{controller} / {action} / {id}')가 요청과 일치하는 컨트롤러를 검색 할 네임 스페이스를 지정하지 않은 경우 발생할 수 있습니다.

이 경우 'namespaces'매개 변수를 사용하는 'MapRoute'메서드의 오버로드를 호출하여이 경로를 등록하십시오.

내 호스트가 작동하는 방식은 FTP 액세스 권한을 부여하고 해당 폴더에는 각 응용 프로그램마다 하나씩 두 개의 다른 폴더가 있다는 것입니다.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com은 정상적으로 작동하며 응용 프로그램을 로컬 파일 시스템에 게시 한 다음 FTP를 사용하여 작동합니다.

bar.com을 업로드하고 실행하려고하면 위의 문제가 발생하여 내 사이트를 사용하지 못하게됩니다. foo.com은 여전히 ​​작동합니다 .

bar.com이 ftpFolderA2 내부의 모든 컨트롤러에서 검색하고 있는데 이것이 다른 것을 찾는 이유 HomeController입니까? Controller 폴더 만 보도록하려면 어떻게해야합니까?

사리:

  1. 영역을 사용하지 않습니다. 이들은 완전히 관련이없는 두 프로젝트입니다. 게시 된 각 프로젝트를 각 해당 폴더에 배치합니다. 멋진 것은 없습니다.
  2. 각 프로젝트에는 1 개의 HomeController 만 있습니다.

누군가 이것이 이것이 문제인지 확인할 수 있습니까?


매우 불명확 한 질문. 지역을 사용하고 있습니까? 문제가 로컬로 발생합니까?
— Darin Dimitrov

1
@Darin : 편집한다는 점에서 정보.
— 여기 만 볼리비아

답변:


473

이 오류 메시지 는 영역을 사용하고 해당 영역과 루트 내에 동일한 컨트롤러 이름 이있을 때 종종 발생 합니다. 예를 들어 두 가지가 있습니다.

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

오류 메시지에서 알 수 있듯이이 문제를 해결하기 위해 경로를 선언 할 때 네임 스페이스를 사용할 수 있습니다. 따라서 주요 경로 정의에서 Global.asax:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);

그리고 당신의 ~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

영역을 사용하지 않으면 두 응용 프로그램이 동일한 ASP.NET 응용 프로그램 내에서 호스팅되고 서로 다른 네임 스페이스에 동일한 컨트롤러가 정의되어 있기 때문에 충돌이 발생하는 것 같습니다. 이러한 종류의 충돌을 피하려면 IIS를 구성하여이 두 가지를 별도의 ASP.NET 응용 프로그램으로 호스팅해야합니다. 서버에 액세스 할 수없는 경우 호스팅 제공 업체에 문의하십시오.


나는 영역을 전혀 사용하지 않습니다. 이들은 FTP 루트 폴더 안의 별도 폴더에 상주하는 완전히 관련이없는 두 응용 프로그램입니다. 어쩌면 내 응용 프로그램은 가능한 모든 곳에서 MVC 컨트롤러를 찾고 있으며 그 범위에 도달하면 다른 홈 컨트롤러로 확장됩니다. 어딘가에 보이지 않지만 자신의 Controller 폴더이며 나머지는 무시하도록 어떻게 말할 수 있습니까?
— 여기에만 볼리비아 사람

2
@ SergioTapia, 그들은 당신의 응용 프로그램과 관련이있는 것 같습니다. 호스팅 제공 업체는이를 동일한 ASP.NET 응용 프로그램에 넣습니다. IIS에서 별도의 인스턴스로 분할하도록 요청하거나 많은 문제가 발생합니다.
— Darin Dimitrov

13
감사. ASP MVC 4.0에서는 네임 스페이스와 같은 명명 된 인수를 전달해야합니다. new [] { "AppName.Areas.Admin.Controllers"}
— om471987

1
+1-잘 작동합니다. 지역에 경로 등록을위한 별도의 지역이 있다는 것을 몰랐습니다. 어디에나 그것은 Darin의 품질 답변이있는 것 같습니다 :)
— Travis J

1
영역을 사용하고 있고 컨트롤러의 네임 스페이스를 지정 하려면 영역 내부 와 외부 의 경로를 모두 네임 스페이스로 지정해야합니다 . 지역 노선을 명명하는 것만 으로도이 문제가 발생했습니다.
— Gavin Ward

528

이 오류가 발생할 수있는 또 다른 시나리오는 다음과 같습니다. 어셈블리의 파일 이름이 변경되도록 프로젝트의 이름을 바꾸면 두 가지 버전의 ASP.NET 어셈블리가있을 수 있으며이 오류가 재현됩니다.

해결책은 bin폴더 로 이동 하여 이전 dll을 삭제하는 것입니다. ( "Rebuild Project"를 시도했지만 삭제하지 않았으므로 bin사라 졌는지 확인하십시오. )


1
이 오류의 다른 변형은 resharper를 사용하고 네임 스페이스 이름 변경을 포함하는 일부 "자동"리 팩터 옵션을 사용하는 경우입니다. 이것은 나에게 일어난 일이었다.
— Sebastian 506563

5
Azure App Service에서이 정보를 얻는 경우 https : // <your_app_name_here> .scm.azurewebsites.net / DebugConsole로 이동하여 파일을 로그인하고 삭제하십시오.
— Tom Blodget

5
Thx 이것은 나에게 문제였다. 기존 프로젝트를 새 폴더에 복사 / 붙여 넣기하여 "새"프로젝트를 만들었습니다. bin 폴더를 삭제하면 오래된 빌드 dll이 함께 제공됩니다.
— brando

프로젝트 파일을 두 번째 드라이브로 옮길 때 이것을 얻었습니다. bin 폴더를 지우면 해결됩니다. 가장 괴상한 일.
— Roberto Bonini

글쎄, 그것은 매우 간단한 수정으로 고통스럽게 성가신 오류였습니다. 감사!
— Troy Grosfield

63

MVC4 및 MVC5에서는 조금 다릅니다. 다음을 사용하십시오.

/App_Start/RouteConfig.cs

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces:  new[] {"MyNamespace.Controllers"}
            );
        }
    }
}

그리고 지역에서

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

39

이것을보십시오 ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

그런 다음이 그림 (내 그림처럼 u를 희망)

여기에 이미지 설명을 입력하십시오


문제를 해결했습니다 ..! :)
— Aruna

1
@ppumkin은 맹인 프로그래머에게 말합니다. 텍스트는 스크린 리더로 읽을 수 있습니다
— Carlos Muñoz

안녕 카를로스. 예, 상황을 이해합니다. 가시성 장애가없는 사람들을 설명하는 것은 이미 어렵습니다. 나는 어떤 종류의 보조 소프트웨어가 그림에서 일어나는 일을 어느 몸 에나 잘 묘사 할 수 있을지 확신하지 못한다. 대답은 아마도 적어도 무슨 일이 일어나고 있는지 설명하려고 텍스트를 가지고 있어야한다는 점에 주목해야합니다.
— Piotr Kula

32

다른 사람들이 말한 것은 올바르지 만 여전히 같은 문제에 직면하는 사람들을 위해 :
나는 다른 프로젝트를 복사하기 때문에 내 경우에 무슨 일이 있었 N 뭔가에 이름 하지만 에 이전 출력 파일 bin불행하게도, 타격 폴더 여전히 있었다 ... 그리고 Build -> Clean Solution이름을 바꾼 후 프로젝트와 그것으로 Namespaces 제거되지 않습니다 ... 그래서 수동으로 삭제 하면 내 문제가 해결되었습니다!


2
당신의 제안이 저를 구했습니다
— Abhimanyu

1
나도, 감사합니다, 깨끗한 dosnt 실제로 깨끗한 의미 grrrr
— katibaer

1
@DrTJ 감사합니다. 당신은 멍청한 청소 프로세스가 작동 할 것으로 기대하고 기대는 실패의 근원입니다. 이로 인해 머리카락을 더 뽑아 낼 수있었습니다!
— Mike

28

프로젝트 bin/폴더에

PROJECT_PACKAGENAME.DLL 만 가지고 있는지 확인하십시오

ANOTHER_PROJECT_PACKAGENAME.DLL을 제거 하십시오.

실수로 여기에 표시되거나 프로젝트 이름을 바꿉니다.


2
정확히 내 문제. 감사합니다.
— Detilium

나를 위해 일했다! thnks!
— 충성 된

어셈블리 이름을 변경하고 오래된 dll을 휴지통에 보관했습니다. 감사
— apc

감사합니다! 나는 너무 간단한 것을 놓쳤다는 것을 믿을 수 없다.
— Vash

25

homeController 클래스와 충돌 할 수있는 다른 dll 파일이 있으면 bin 폴더를 확인하십시오 .


7
이것은 프로젝트를 복사하고 이름을 바꿀 때 저를 물었습니다. dll이라는 오래된 프로젝트는 여전히 휴지통에 있었고 정리는 제거하지 않았습니다 ... 수동으로 삭제해야했습니다!
— Paul Zahra

2
이것은 나에게 문제였다. 동료가 실수로 한 프론트 엔드 프로젝트에서이 이슈를 생성하는 다른 프로젝트로의 참조를 추가했습니다. 그는 참조를 제거하여 Visual Studio에서 디스크의 dll 파일도 제거했습니다. Git에서 업데이트를 가져 왔지만 참조는 사라졌지 만 dll 파일은 깨끗하게 유지 된 후에도 남아있었습니다. 내 VS가 더 이상 참조를 보지 못했기 때문에. 그러나 IIS를 실행할 때 파일을보고 사용했습니다. 내 디스크에서 제거하면 도움이되었습니다.
— Yeronimo

14

또 다른 해결책은 ControllerBuilder에 기본 네임 스페이스를 등록하는 것입니다. 우리는 기본 응용 프로그램에 많은 경로가 있고 영역에 이미 하나의 일반 경로 (우리는 네임 스페이스를 지정하고 있음) 만 있기 때문에 이것이 가장 쉬운 해결책이라는 것을 알았습니다.

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");

이것은 나를위한 경우였습니다. 이름이 같은 컨트롤러가 여러 개인 경우 경로 정의에 네임 스페이스를 추가 한 후에 필요할 수 있습니다. 예를 들어, 경로에 의해 컨트롤러와 영역이 명시 적으로 선택되지 않은 홈페이지의 경우.
— Jason Beck

내가 진행하는 프로젝트에는 맞춤형 클라이언트 작업 영역이있는 주요 턴키 백 오피스가 있습니다. 각각에는 '설정'컨트롤러가 있습니다. 이 답변은 각 영역의 설정 컨트롤러에 대한 경로를 정의해야하는 훌륭한 대안입니다.
— Derreck Dean

7

영역을 사용하지 않더라도 RouteMap에서 사용할 네임 스페이스를 계속 지정할 수 있습니다.

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" },
    new[] { "NameSpace.OfYour.Controllers" }
);

그러나 실제 문제는 IIS에서 두 개의 앱을 설정하는 방식입니다.


7

방금이 문제가 있었지만 웹 사이트에 게시 할 때만 로컬 디버그에서 제대로 실행되었습니다. 내 웹 호스트에서 FTP를 사용해야하고 게시 디렉토리로 이동하여 BIN 폴더의 파일을 삭제해야한다는 것을 알았습니다. 게시 할 때 로컬로 파일을 삭제해도 아무런 효과가 없었습니다.


이것은 나를위한 수정이었습니다. 내 게시 프로필은 로컬에없는 파일을 제거하지 않았으므로 앱에서 새 dll 외에도 오래된 dll을 선택하고 중복 유형을 찾았습니다.
— 형태

1
내 프로젝트 이름을 변경하고 모든 파일을 refractored했지만이 오류가 발생했습니다. bin 폴더를 삭제하면 나에게도 효과가있었습니다.
— Mauro Valvano

6

Areas의 경우에도 전역 라우팅 테이블에 네임 스페이스를 제공하는 등 Areas에서 라우팅의 모든 단계를 수행 한 경우가있을 수 있습니다 .

라우팅에서 제공 한 '네임 스페이스'에 글로벌 컨트롤러를 래핑하지 않았을 수 있습니다.

예 :

이것을 완료하십시오 :

public class HomeController : Controller
{

대신에:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

예 MapRoute에서 네임 스페이스를 제공하는 것만으로는 충분하지 않습니다. 여기에 제공된 네임 스페이스는 컨트롤러 클래스의 네임 스페이스와 일치해야합니다. 이제 작동합니다!
— DanKodi

6

DefaultAssembliesResolver의 GetAssemblies를 재정 의하여 ApiController를 포함하는 자체 어셈블리를 추가하고 이미 base의 배열에있는 경우 500 오류가 발생할 수 있습니다.

지목 사항:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        var baseAssemblies = base.GetAssemblies();

        var assemblies = new List<Assembly>(baseAssemblies);

        assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver)));

        return new List<Assembly>(assemblies);
    }
}

위 코드가 Controller와 동일한 어셈블리에있는 경우 해당 어셈블리는 목록에 두 번 표시되며 웹 API는 사용할 코드를 모르기 때문에 500 오류를 생성합니다.


6

자동으로 해결하려면 응용 프로그램을 다음 코드를 추가하여 사용할 수 있습니다.

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { string.Format("{0}.Controllers", BuildManager.GetGlobalAsaxType().BaseType.Assembly.GetName().Name) }
        );

1
여러 프로젝트에 동일한 컨트롤러가있는 경우 훌륭한 솔루션
— Ravi Anand

4

같은 문제가 있었고 아무런 도움이되지 않았습니다. 문제는 실제로 복제본이 없다는 것입니다.이 오류는 프로젝트 네임 스페이스를에서 (으) MyCuteProject로 전환 한 후에 나타납니다 MyCuteProject.Web.

결국 오류의 원인은 -codebehind가 global.asax아니라 XML 마크 업 이라는 파일 이라는 것을 깨달았습니다 .cs. 그 안에 네임 스페이스를 확인하십시오. 도움이되었습니다.


2

방금 서버에서 폴더 'Bin'을 삭제하고 내 저장소를 서버로 복사하면 문제가 해결되었습니다.



1

빌드에서 경고로 표시되는 충돌이있을 때이 오류가 발생했습니다.

Visual Studio-> 도구-> 옵션-> 프로젝트 및 솔루션-> 빌드 및 실행-> MSBuild 프로젝트 빌드 출력 세부 정보를 세부 수준으로 늘릴 때까지 세부 정보를 얻지 못했습니다.

우리 프로젝트는 .net v4 웹 애플리케이션이며 System.Net.Http (v2.0.0.0)와 System.Net.Http (v4.0.0.0) 사이에 충돌이있었습니다. 우리 프로젝트는 패키지에서 파일의 v2 버전을 참조했습니다 (nuget을 사용하여 포함). 참조를 제거하고 v4 버전에 대한 참조를 추가하면 빌드가 작동하고 (경고없이) 오류가 수정되었습니다.


1

이 오류의 다른 변형은 resharper를 사용하고 네임 스페이스 이름 변경을 포함하는 일부 "자동"리 팩터 옵션을 사용하는 경우입니다. 이것이 나에게 일어난 일입니다. 이 시나리오의 문제를 해결하려면 폴더 삭제bin


이것은 다른 프로젝트의 내용을 통해 1 프로젝트의 내용으로 복사 할 때 나에게 일어났습니다. 나는 bin 폴더에서 특정 파일을 삭제했다
— 아드리안 Davel에게

1

프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 정리를 선택하십시오. 또는 bin 디렉토리를 완전히 비운 후 다시 빌드하십시오. 이전 빌드에서 남은 어셈블리가 없어야합니다.


1

단일 응용 프로그램에서이 문제도 발생합니다.이 경우 응용 프로그램을 게시 할 때이 확인란을 선택하십시오. 여기에 이미지 설명을 입력하십시오


1

다른 도움이 될 수 있다면이 오류에 직면했습니다. 웹 사이트에서 잘못된 참조로 인해 문제가 발생했습니다. 알 수없는 이유로 내 웹 사이트가 동일한 솔루션에서 다른 웹 사이트를 참조하고있었습니다. 그리고 그 나쁜 참조를 제거하면 일이 제대로 시작되었습니다.


0

Episerver 또는 다른 MVC 기반 CMS에서 작업중인 경우 해당 특정 컨트롤러 이름이 이미 청구 된 것을 알 수 있습니다.

라는 컨트롤러를 만들려고 할 때 이런 일이 발생했습니다 FileUpload.


0

나는 비슷한 문제에 직면했다. 그리고 주된 이유는 두 개의 다른 영역에서 동일한 컨트롤러를 사용했기 때문입니다. 일단 그들 중 하나를 제거하면 잘 작동합니다.

도움이 될 것입니다.

프로젝트 솔루션


0

하나의 솔루션에 동일한 컨트롤러 이름을 가진 두 개의 프로젝트가 있습니다. 첫 번째 프로젝트에서 두 번째 프로젝트 참조를 제거하고 문제가 해결되었습니다.


0

App_Code가 아닌 디렉토리에 컨트롤러를 만들 때 기존 ASP.NET 웹 사이트 에서이 오류가 발생할 수 있음을 발견했습니다 (때로는 Visual Studio에서이를 방지합니다).

"App_Code"에 추가 된 모든 코드는 "Content"로 설정되는 반면 파일 형식은 "Compile"로 설정됩니다. 파일을 App_Code로 복사하거나 이동하면 여전히 "컴파일"로 설정됩니다.

웹 사이트 프로젝트에는 빌드 작업이 없으므로 웹 사이트 프로젝트 작업과 관련이 있다고 생각합니다 .bin 폴더를 지우고 "콘텐츠"로 변경하면 문제가 해결됩니다.

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