Foram encontrados vários tipos que correspondem ao controlador chamado 'Início'

318

Atualmente, tenho dois projetos MVC3 não relacionados hospedados online.

Um funciona bem, o outro não funciona, dando-me o erro:

Foram encontrados vários tipos que correspondem ao controlador chamado 'Início'. Isso pode acontecer se a rota que atende a essa solicitação ('{controller} / {action} / {id}') não especificar namespaces para procurar um controlador que corresponda à solicitação.

Se for esse o caso, registre essa rota chamando uma sobrecarga do método 'MapRoute' que usa o parâmetro 'namespaces'.

O funcionamento do meu hoster é que ele me dá acesso ao FTP e nessa pasta eu tenho duas outras pastas, uma para cada um dos meus aplicativos.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

O foo.com funciona bem, publico meu aplicativo no meu sistema de arquivos local, depois o conteúdo do FTP e ele funciona.

Quando carrego e tento executar o bar.com, o problema acima é acionado e impede que eu use meu site. Enquanto isso, foo.com ainda funciona .

O bar.com está pesquisando nos controladores EM TODA PARTE dentro do ftpFolderA2 e é por isso que está encontrando outro HomeController? Como posso dizer para ele procurar apenas na pasta Controller como deveria?

Fatos:

  1. Não usando áreas. Estes são dois projetos completamente não relacionados. Coloco cada projeto publicado em cada pasta respectiva. Nada chique.
  2. Cada projeto possui apenas 1 HomeController.

Alguém pode confirmar que este é o problema?

Somente Boliviano Aqui
fonte
Pergunta muito incerta. Você está usando áreas? O problema ocorre localmente?
precisa
1
@Darin: Editou essa informação em.
Only Bolivian Here

Respostas:

473

Essa mensagem de erro geralmente ocorre quando você usa áreas e tem o mesmo nome de controlador dentro da área e da raiz. Por exemplo, você tem os dois:

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

Para resolver esse problema (como a mensagem de erro sugere), você pode usar espaços para nome ao declarar suas rotas. Então, na principal definição de rota em Global.asax:

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

e no seu ~/Areas/Admin/AdminAreaRegistration.cs:

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

Se você não estiver usando áreas, parece que seus dois aplicativos estão hospedados no mesmo aplicativo ASP.NET e ocorrem conflitos porque você tem os mesmos controladores definidos em diferentes namespaces. Você precisará configurar o IIS para hospedar esses dois como aplicativos ASP.NET separados, se desejar evitar esse tipo de conflito. Peça isso ao seu provedor de hospedagem, se você não tiver acesso ao servidor.

Darin Dimitrov
fonte
Não estou usando áreas. Esses são dois aplicativos completamente independentes que residem em uma pasta separada dentro de uma pasta raiz do FTP. Talvez meu aplicativo esteja procurando por controladores MVC em todos os lugares e que alcancem o mesmo alcance para o outro Controlador Doméstico. Como posso dizer para não procurar em lugar algum, mas é a própria pasta Controller e desconsiderar o resto?
Somente boliviano Aqui
2
@SergioTapia, parece que eles estão bastante relacionados às suas aplicações. Seu provedor de hospedagem os coloca no mesmo aplicativo ASP.NET. Você precisará pedir que ele os divida no IIS como instâncias separadas ou você terá muitos problemas.
Darin Dimitrov
13
Obrigado. Em ASP MVC 4.0 você precisa passar argumento nomeado como namespaces: novas [] { "AppName.Areas.Admin.Controllers"}
om471987
1
+1 - Funciona bem. Eu não sabia que havia uma área separada para registro de rotas em áreas. Em todos os lugares que eu olho parece que não há uma resposta de qualidade de Darin :)
Travis J
1
Se você estiver usando áreas e quer namespace os controladores, você precisa namespace ambas as rotas no interior da área e exterior. Apenas o namespace da rota da área ainda me deu esse problema.
Gavin Ward
528

Aqui está outro cenário em que você pode enfrentar esse erro. Se você renomear seu projeto para que o nome do arquivo do assembly seja alterado, é possível que você tenha duas versões do seu assembly ASP.NET, que reproduzirão esse erro.

A solução é ir para a sua binpasta e excluir as DLLs antigas. (Tentei "Reconstruir projeto", mas isso não os excluiu, por isso, verifique se bineles se foram)

Kirk Woll
fonte
1
Outra variação desse erro ocorre quando você usa o recarregador e algumas opções de refatoração "automáticas" que incluem a alteração do nome do espaço para nome. Foi o que aconteceu comigo.
Sebastian 506563
5
Se você estiver obtendo isso de um Serviço de Aplicativo do Azure, vá para https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole para efetuar logon e excluir arquivos.
precisa
5
Thx este foi o problema para mim. Eu criei um "novo" projeto copiando / colando um projeto existente em uma nova pasta; os velhos dlls construção veio com, a exclusão de pasta bin limpou-o limpo
brando
Consegui isso ao mover meus arquivos de projeto para uma segunda unidade. Limpar a pasta bin resolve isso. Coisa mais estranha.
Roberto Bonini 17/10
Bem, isso foi um erro dolorosamente irritante com uma correção muito simples. Obrigado!
Troy Grosfield
63

No MVC4 e no MVC5, é um pouco diferente, use o seguinte

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

e em áreas

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

Assista a isso ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Então esta foto (espero que você goste dos meus desenhos)

insira a descrição da imagem aqui

Tom
fonte
Resolvido o problema ..! :)
Aruna
1
@ppumkin diz isso a um programador cego. O texto pode ser lido pelos leitores de tela
Carlos Muñoz
Oi Carlos. Sim, eu entendo a situação. Já é difícil explicar pessoas sem deficiência de visibilidade. Não tenho certeza de que algum tipo de software auxiliar possa descrever bem o que está acontecendo na imagem para qualquer organismo. Chama a atenção que a resposta provavelmente deve ter texto, pelo menos tentando descrever o que está acontecendo.
Piotr Kula
32

O que os outros disseram está correto, mas para aqueles que ainda enfrentam o mesmo problema:
No meu caso, aconteceu porque copiei outro projeto e o renomeei para outra coisa, MAS os arquivos de saída anteriores na binpasta ainda estavam lá ... E, infelizmente, pressionando Build -> Clean Solutionapós renomear projeto e Namespaces não os remove ... então excluí- los manualmente resolveu meu problema!

Dr TJ
fonte
2
sua sugestão me salvou
Abhimanyu
1
me também, graças, dosnt limpo realmente significa limpo, grrrr
katibaer
1
Obrigado @DrTJ Isso foi muuuuito frustrante! Você espera que o processo limpo dang funcione e as expectativas são a raiz do fracasso. Isso me salvou puxando meu cabelo ainda mais!
318 Mike
28

na sua bin/pasta do projeto

verifique se você possui apenas seu PROJECT_PACKAGENAME.DLL

e remova ANOTHER_PROJECT_PACKAGENAME.DLL

que pode aparecer aqui por engano ou você simplesmente renomeia seu projeto

Sruit A.Suk
fonte
2
Exatamente o meu problema. Obrigado.
Detilium
Trabalhou para mim! thnks!
eyal 5/01
Eu havia mudado o nome da montagem e tinha algumas dlls antigas na lixeira. Obrigado
apc
Obrigado! Não acredito que perdi algo tão simples.
Vash
25

Verifique a pasta bin se houver outro arquivo DLL que possa estar em conflito com a classe homeController.

Amir Shrestha
fonte
7
Isso me mordeu ao copiar um projeto e renomeá-lo ... o projeto antigo chamado dll ainda estava na lixeira, uma limpeza não o removeu ... tive que excluí-lo manualmente!
Paul Zahra
2
Este foi o problema para mim. Um colega adicionou por engano uma referência de um projeto front-end para outro, criando esse problema. Ele removeu a referência, portanto, o Visual Studio também remove os arquivos DLL em seu disco. Puxei a atualização do Git, as referências foram embora, mas os arquivos DLL permaneceram, mesmo depois de uma limpeza. Simplesmente porque meu VS não viu mais a referência. Mas, ao executar o IIS, viu os arquivos e os usou. Removê-los do meu disco ajudou.
Yeronimo
14

Outra solução é registrar um espaço para nome padrão no ControllerBuilder. Como tínhamos muitas rotas em nosso aplicativo principal e apenas uma única rota genérica em nossas áreas (onde já estávamos especificando um espaço para nome), achamos que essa é a solução mais fácil:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Ben Foster
fonte
Esse foi o meu caso. Se você realmente tiver vários controladores com o mesmo nome, isso poderá ser necessário após a adição de namespaces às definições de rota. Por exemplo, para sua página inicial onde o controlador e a área não são explicitamente escolhidos pelo caminho.
Jason Beck
No projeto em que trabalho, temos um backoffice principal chave na mão com áreas para o trabalho personalizado do cliente. Cada um tem um controlador de 'configurações'. Essa resposta é uma ótima alternativa para definir uma rota para o controlador de configurações de cada área.
Derreck Dean
7

Mesmo que você não esteja usando áreas, você ainda pode especificar no seu RouteMap qual namespace usar

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

Mas parece que o problema real é a maneira como seus dois aplicativos são configurados no IIS

StanK
fonte
7

Acabei de ter esse problema, mas somente quando publiquei no meu site, na depuração local, ele correu bem. Eu descobri que tinha que usar o FTP do meu host da web e ir para o meu diretório de publicação e excluir os arquivos na pasta BIN, excluí-los localmente não fez nada quando publiquei.

Mech0z
fonte
Essa foi a solução para mim. Meu perfil de publicação não removeu arquivos que não estavam presentes localmente; portanto, meu aplicativo pegou dlls antigas, além de novas, e encontrou tipos duplicados.
Forma
1
Mudei o nome do meu projeto e atualizei todos os arquivos, mas recebi esse erro. A exclusão da pasta bin também funcionou para mim.
Mauro Valvano
6

Pode haver outro caso com o Áreas, mesmo que você tenha seguido todas as etapas do roteamento em Áreas (como fornecer namespaces na tabela de roteamento global), que é:

Você pode não ter agrupado seus Controladores Globais no 'namespace' que você forneceu no roteamento.

Por exemplo:

Feito isso:

public class HomeController : Controller
{

Ao invés de:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
T Gupta
fonte
Sim Não basta fornecer um espaço para nome no MapRoute. O espaço para nome fornecido aqui precisa corresponder ao espaço para nome da classe do controlador. Agora funciona!
precisa saber é o seguinte
6

Você também pode obter o erro 500 se adicionar seu próprio assembly que contém o ApiController substituindo GetAssemblies do DefaultAssembliesResolver e ele já estiver na matriz da base.GetAssemblies ()

Caso em questão:

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

se o código acima estiver no mesmo assembly que o seu Controller, esse assembly estará na lista duas vezes e gerará um erro 500, pois a API da Web não sabe qual usar.

Allan Elder
fonte
6

se você quiser resolvê-lo automaticamente .. você pode usar o aplicativo de forma apropriada, basta adicionar o seguinte código:

 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) }
        );
Xtremexploit
fonte
1
grande solução se você tiver mesmos controladores em vários projetos
Ravi Anand
4

Tenho o mesmo problema e nada ajudou. O problema é que, na verdade, não tenho duplicatas, esse erro aparece após a troca do namespace do projeto de MyCuteProjectpara MyCuteProject.Web.

No final, percebi que a fonte do erro é um global.asaxarquivo - marcação XML, não .cs-codebehind. Verifique o espaço para nome nele - isso me ajudou.

Arman Hayots
fonte
2

Acabei de excluir a pasta 'Bin' do servidor e copiar minha lixeira para o servidor, e meu problema foi resolvido.

javad hemati
fonte
2

No Route.config

namespaces: new [] {"Appname.Controllers"}

Awais
fonte
1

Descobrimos que ocorreu esse erro quando houve um conflito em nossa compilação que apareceu como um aviso.

Não obtivemos os detalhes até aumentarmos o Visual Studio -> Ferramentas -> Opções -> Projetos e soluções -> Construir e executar -> MSBuild construir a verbosidade da saída do projeto para Detalhada.

Nosso projeto é um aplicativo da web .net v4 e houve um conflito entre System.Net.Http (v2.0.0.0) e System.Net.Http (v4.0.0.0). Nosso projeto referenciou a versão v2 do arquivo de um pacote (incluído usando o nuget). Quando removemos a referência e adicionamos uma referência à versão v4, a construção funcionou (sem avisos) e o erro foi corrigido.

AnthonyJ
fonte
1

Outra variação desse erro ocorre quando você usa o recarregador e algumas opções de refatoramento "automáticas" que incluem a alteração do nome do namespace. Isso é o que aconteceu comigo. Para resolver problemas com esse tipo de cenário, exclua a pastabin

Sebastian 506563
fonte
Isso aconteceu comigo quando copiei o conteúdo de um projeto sobre o conteúdo de outro. Eu tive que excluir os arquivos específicos da pasta bin
Adriaan Davel 26/02
1

Clique com o botão direito do mouse no projeto e selecione limpar o projeto. Ou então esvazie completamente o diretório bin e, em seguida, recrie novamente. Isso deve evitar qualquer sobra de montagens de compilações anteriores

VivekDev
fonte
1

Em algum momento de um único aplicativo, esse problema também ocorre. Nesse caso, marque essas caixas de seleção ao publicar seu aplicativo insira a descrição da imagem aqui

Umang Patwa
fonte
1

Se isso puder ajudar outros, também enfrentarei esse erro. O problema foi causado pela referência incorreta no meu site. Por motivos desconhecidos, meu site estava se referindo a outro site, na mesma solução. E depois que removi essa referência ruim, a coisa começou a funcionar corretamente.

Hugo
fonte
0

Se você estiver trabalhando no Episerver ou em outro CMS baseado em MVC, poderá descobrir que esse nome de controlador específico já foi reivindicado.

Isso aconteceu comigo ao tentar criar um controlador chamado FileUpload.


fonte
0

Eu estava enfrentando o problema semelhante. e o principal motivo foi que eu tinha o mesmo controlador em duas áreas diferentes. uma vez que eu remover o deles está funcionando bem.

Eu tenho isso será útil para você.

Solução do Projeto

Satish Kumar sonker
fonte
0

Eu tenho dois projetos em uma solução com o mesmo nome de controlador. Removi a segunda referência do projeto no primeiro projeto e o problema foi resolvido

Kashif Faraz
fonte
0

Descobri que esse erro pode ocorrer no site tradicional do ASP.NET quando você cria o Controller no diretório não App_Code (às vezes o Visual Studio impede isso).

Ele define o tipo de arquivo como "Compilar", enquanto qualquer código adicionado a "App_Code" é definido como "Conteúdo". Se você copiar ou mover o arquivo para App_Code, ele ainda será definido como "Compilar".

Eu suspeito que ele tenha algo a ver com a operação do Projeto do site, pois os projetos do site não têm nenhuma operação de compilação. Limpar a pasta bin e alterar para "Conteúdo" parece corrigi-lo.

Curtis White
fonte