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