c# 강좌 - 'Home'컨트롤러와 일치하는 여러 유형이 발견되었습니다.




패턴 mvc란 (21)

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

현재 온라인에서 호스팅되는 두 개의 무관 한 MVC3 프로젝트가 있습니다.

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

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

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

내 hoster 작동 방법은 그가 나에게 FTP 액세스를 제공하고 그 폴더에 두 개의 다른 폴더가 하나씩 있습니다.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

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

업로드하고 bar.com을 실행하려고하면 위의 문제로 인해 사이트가 사용되지 않습니다. foo.com이 여전히 작동하는 동안 모두 .

bar.com은 ftpFolderA2 내부에서 컨트롤러를 통해 검색하고 있기 때문에 다른 HomeController 찾는 이유는 무엇입니까? Controller 폴더를보기 만하면 어떻게 알 수 있습니까?

사리:

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

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


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

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

하지만 실제 문제는 IIS에서 두 앱을 설정하는 것과 같습니다.


자동으로 해결하려면 .. 다음 코드를 추가하기 만하면됩니다.

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

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

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

Episerver 또는 다른 MVC 기반 CMS에서 작업하는 경우 특정 컨트롤러 이름이 이미 청구 된 것입니다.

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


단일 응용 프로그램에서 언젠가이 문제도 발생합니다.이 경우 응용 프로그램을 게시 할 때이 확인란을 선택하십시오.


프로젝트 bin/ 폴더에서

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

ANOTHER_PROJECT_PACKAGENAME.DLL을 제거 하십시오.

실수로 여기에 나타날 수도 있고 프로젝트의 이름을 바꿀 수도 있습니다.


영역 에서 라우팅하는 모든 단계 (예 : 글로벌 라우팅 테이블에서 네임 스페이스 제공)를 수행 한 경우에도 다음과 같은 경우가있을 수 있습니다.

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

예 :

완료 :

public class HomeController : Controller
{

대신에:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

난 그냥이 문제가 있었지만, 내 웹 사이트에 게시했을 때, 내 로컬 디버그에서 괜찮 았어. 내 웹 호스트에서 FTP를 사용하여 내 게시 디렉터리에 들어가서 BIN 폴더에있는 파일을 삭제해야한다는 것을 알았습니다. 공개 할 때 로컬로 삭제할 필요가 없었습니다.


방금 서버에서 'Bin'폴더를 삭제하고 내 bin을 서버에 복사하면 문제가 해결됩니다.


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

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


우리는 빌드에서 경고로 나타난 충돌이있을 때이 오류가 있음을 발견했습니다.

우리는 Visual Studio -> 도구 -> 옵션 -> 프로젝트 및 솔루션 -> 빌드 및 실행 -> MSBuild 프로젝트 출력 세부 정보를 Detailed로 증가시킬 때까지 세부 정보를 얻지 못했습니다.

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


이 오류에 직면 할 수있는 또 다른 시나리오가 있습니다. 어셈블리의 파일 이름이 변경되도록 프로젝트의 이름을 변경하면이 오류를 재현 할 수있는 ASP.NET 어셈블리의 두 가지 버전이있을 수 있습니다.

해결 방법은 bin 폴더로 이동하여 이전 dll을 삭제하는 것입니다. (나는 "Rebuild Project"를 시도했으나 삭제하지 않았기 때문에 bin 이 제대로 작동하는지 확인해야한다.)


프로젝트를 마우스 오른쪽 버튼으로 클릭하고 프로젝트를 선택하십시오. 그렇지 않으면 bin 디렉토리를 완전히 비운 다음 다시 빌드하십시오. 이전 빌드의 나머지 어셈블리가 없어야합니다.


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


나는 비슷한 문제에 직면했다. 주된 이유는 두 개의 다른 지역에서 같은 컨트롤러를 사용했기 때문입니다. 일단 내가 그 중 하나를 제거하는 일 벌금.

나는 너에게 도움이 될 것이다.


다른 사람들이 말한 것은 정확하지만 여전히 똑같은 문제에 직면 해있는 사람들에게는 :
제 경우에는 다른 프로젝트 이름을 다른 것으로 복사했기 때문에 일어났습니다. 그러나 bin 폴더의 이전 출력 파일은 여전히 ​​거기에있었습니다 ... 그리고 불행히도 프로젝트와 Namespaces 이름을 변경 한 후에 Build -> Clean Solution 을 클릭 해도 제거되지 않습니다 ... 그래서 그들을 수동으로 삭제 내 문제를 해결!


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


또한 DefaultAssembliesResolver의 GetAssemblies를 재정 의하여 ApiController가 포함 된 자체 어셈블리를 추가하고 base.GetAssemblies ()의 배열에 이미있는 경우 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);
    }
}

위의 코드가 컨트롤러와 동일한 어셈블리에 있으면 해당 어셈블리는 목록에 두 번 나타나고 웹 API는 사용할 코드를 모르기 때문에 500 개의 오류가 발생합니다.



MVCContrib 는 현재 IoC-MVC 통합을위한 권위있는 소스입니다. 현재, MVC3 브랜치는 컨트롤러 팩토리와 IDependencyResolver 구현 (및 몇 가지 다른 것들) 만 포함하고있다. 저장소를 포크로 작성하고 누락 된 확장 점을 구현하는 것이 좋습니다 (너무 어렵지 않아야 함). 그런 다음 팀에 풀 요청을 보냅니다.





c# asp.net-mvc-3 controller