Se encontraron varios tipos que coinciden con el controlador llamado 'Inicio'

318

Actualmente tengo dos proyectos MVC3 no relacionados alojados en línea.

Uno funciona bien, el otro no funciona, dándome el error:

Se encontraron varios tipos que coinciden con el controlador llamado 'Inicio'. Esto puede suceder si la ruta que atiende esta solicitud ('{controller} / {action} / {id}') no especifica espacios de nombres para buscar un controlador que coincida con la solicitud.

Si este es el caso, registre esta ruta llamando a una sobrecarga del método 'MapRoute' que toma un parámetro 'espacios de nombres'.

La forma en que funciona mi host es que me da acceso FTP y en esa carpeta tengo otras dos carpetas, una para cada una de mis aplicaciones.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com funciona bien, publico mi aplicación en mi sistema de archivos local, luego el contenido de FTP y funciona.

Cuando subo e intento ejecutar bar.com, el problema anterior se dispara y me impide usar mi sitio. Todo mientras foo.com todavía funciona .

¿Bar.com está buscando desde controladores EN TODAS PARTES dentro de ftpFolderA2 y es por eso que está buscando otro HomeController? ¿Cómo puedo decirle que solo se vea en la carpeta Controlador como debería?

Hechos:

  1. No usar áreas. Estos son dos proyectos COMPLETAMENTE no relacionados. Coloco cada proyecto publicado en cada carpeta respectiva. Nada sofisticado.
  2. Cada proyecto solo tiene 1 HomeController.

¿Alguien puede confirmar que este es el problema?

Solo bolivianos aquí
fuente
Pregunta muy poco clara. ¿Estás usando áreas? ¿El problema ocurre localmente?
Darin Dimitrov
1
@Darin: Editó esa información en.
Solo boliviano aquí

Respuestas:

473

Este mensaje de error a menudo ocurre cuando usa áreas y tiene el mismo nombre de controlador dentro del área y la raíz. Por ejemplo, tienes los dos:

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

Para resolver este problema (como lo sugiere el mensaje de error), puede usar espacios de nombres al declarar sus rutas. Entonces, en la definición de ruta principal en Global.asax:

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

y en tu ~/Areas/Admin/AdminAreaRegistration.cs:

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

Si no está utilizando áreas, parece que ambas aplicaciones están alojadas dentro de la misma aplicación ASP.NET y se producen conflictos porque tiene los mismos controladores definidos en diferentes espacios de nombres. Tendrá que configurar IIS para alojar esos dos como aplicaciones ASP.NET separadas si desea evitar este tipo de conflictos. Pídale esto a su proveedor de alojamiento si no tiene acceso al servidor.

Darin Dimitrov
fuente
No estoy usando áreas en absoluto. Estas son dos aplicaciones completamente no relacionadas que residen en una carpeta separada dentro de una carpeta raíz FTP. Tal vez mi aplicación está buscando controladores MVC donde sea que pueda y ese alcance se extiende al otro Home Controller. ¿Cómo puedo decirle que no busque en otra parte que no sea su propia carpeta Controlador y no tenga en cuenta el resto?
Solo boliviano aquí
2
@SergioTapia, parece que están bastante relacionadas con tus aplicaciones. Su proveedor de alojamiento los puso dentro de la misma aplicación ASP.NET. Tendrá que pedirle que los divida en IIS como instancias separadas o tendrá muchos problemas.
Darin Dimitrov
13
Gracias. En ASP MVC 4.0, debe pasar un argumento con nombre como espacios de nombres: nuevo [] {"AppName.Areas.Admin.Controllers"}
om471987
1
+1: funciona bien. No me di cuenta de que había un área separada para el registro de rutas en áreas. Por donde miro parece que hay una respuesta de calidad de Darin :)
Travis J
1
Si está utilizando áreas y desea namespace los controladores, es necesario espacio de nombres tanto las rutas dentro del área y el exterior. Solo los espacios de nombres en la ruta del área todavía me dieron este problema.
Gavin Ward
528

Aquí hay otro escenario en el que podría enfrentar este error. Si cambia el nombre de su proyecto para que cambie el nombre del archivo del ensamblado, es posible que tenga dos versiones de su ensamblado ASP.NET, lo que reproducirá este error.

La solución es ir a su bincarpeta y eliminar los dlls antiguos. (Intenté "Reconstruir proyecto", pero eso no los eliminó, así que asegúrese de verificar binque se hayan ido)

Kirk Woll
fuente
1
Otra variación de este error es cuando usa resharper y usa algunas opciones de refactorización "automática" que incluyen el cambio de nombre del espacio de nombres. Esto fue lo que me pasó a mí.
Sebastian 506563
55
Si obtiene esto de un Servicio de aplicaciones de Azure, vaya a https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole para iniciar sesión y eliminar archivos.
Tom Blodget
55
Thx este fue el problema para mí. Había creado un "nuevo" proyecto copiando / pegando un proyecto existente en una nueva carpeta; vinieron los viejos dlls de compilación, al eliminar la carpeta bin se limpió
brando
Obtuve esto cuando moví mis archivos de proyecto a una segunda unidad. Borrar la carpeta bin lo resuelve. Lo más extraño.
Roberto Bonini
Bueno, ese fue un error dolorosamente molesto con una solución muy simple. ¡Gracias!
Troy Grosfield
63

En MVC4 y MVC5 es un poco diferente, use el siguiente

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

y en áreas

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

Mira esto ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Entonces esta foto (espero que te gusten mis dibujos)

ingrese la descripción de la imagen aquí

Tom
fuente
Resuelto el problema ..! :)
Aruna
1
@ppumkin le cuenta eso a un programador ciego. Sin embargo
Carlos Muñoz
Hola Carlos. Sí, entiendo la situación. Ya es difícil explicarlo a personas sin discapacidades de visibilidad. Ni siquiera estoy seguro de que ningún tipo de software de asistencia pueda describir bien lo que está sucediendo en la imagen a cualquier cuerpo. Llama la atención que la respuesta probablemente debería tener texto al menos tratando de describir lo que está sucediendo.
Piotr Kula
32

Lo que otros dijeron es correcto, pero para aquellos que aún enfrentan el mismo problema:
en mi caso sucedió porque copié otro proyecto y lo renombré a otra cosa PERO los archivos de salida anteriores en la bincarpeta todavía estaban allí ... Y desafortunadamente, presioné Build -> Clean Solutiondespués de cambiar el nombre del proyecto y Namespaces no los elimina ... ¡así que eliminarlos manualmente resolvió mi problema!

Dr. TJ
fuente
2
su sugerencia me salvó
Abhimanyu
1
yo también, gracias, dosificador limpio en realidad significa limpio, grrrr
katibaer
1
Gracias @DrTJ ¡Esto fue muy frustrante! Usted espera que el proceso de limpieza dang funcione y las expectativas son la raíz del fracaso. ¡Esto me salvó de sacarme el pelo aún más!
Mike
28

en tu bin/carpeta de proyecto

asegúrese de tener solo su PROJECT_PACKAGENAME.DLL

y elimine ANOTHER_PROJECT_PACKAGENAME.DLL

que puede aparecer aquí por error o simplemente renombra tu proyecto

Sruit A.Suk
fuente
2
Exactamente mi problema. Gracias.
Detilium
¡Trabajó para mi! gracias!
Eyal
Había cambiado el nombre de la asamblea y tenía algunos viejos dlls sentados en la papelera. Gracias
apc
¡Gracias! No puedo creer que me perdí algo tan simple.
Vash
25

Verifique la carpeta bin si hay otro archivo dll que pueda tener conflictos con la clase homeController.

Amir Shrestha
fuente
77
Esto me mordió al copiar un proyecto y renombrarlo ... el antiguo proyecto llamado dll todavía estaba en el contenedor, una limpieza no lo eliminó ... ¡Tuve que eliminarlo manualmente!
Paul Zahra
2
Este fue el problema para mí. Un colega agregó por error una referencia de un proyecto front-end a otro creando este problema. Eliminó la referencia, por lo tanto, Visual Studio también eliminó los archivos dll en su disco. Saqué la actualización de Git, las referencias desaparecieron, pero los archivos dll permanecieron, incluso después de una limpieza. Simplemente porque mi VS ya no veía la referencia. Pero al ejecutar IIS vi los archivos y los usé. Quitarlos de mi disco ayudó.
Yeronimo
14

Otra solución es registrar un espacio de nombres predeterminado con ControllerBuilder. Dado que teníamos muchas rutas en nuestra aplicación principal y solo una ruta genérica en nuestras áreas (donde ya estábamos especificando un espacio de nombres), encontramos que esta es la solución más fácil:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Ben Foster
fuente
Este fue el caso para mí. Si realmente tiene múltiples controladores con el mismo nombre, esto puede ser necesario después de haber agregado espacios de nombres a sus definiciones de ruta. Por ejemplo, para su página de inicio donde el controlador y el área no son elegidos explícitamente por la ruta.
Jason Beck
En el proyecto en el que trabajo, tenemos una oficina principal llave en mano con áreas para el trabajo personalizado del cliente. Cada uno tiene un controlador de 'configuración'. Esta respuesta es una gran alternativa a tener que definir una ruta para el controlador de configuración para cada área.
Derreck Dean
7

Aunque no esté utilizando áreas, puede especificar en su RouteMap qué espacio de nombres usar

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

Pero parece que el problema real es la forma en que sus dos aplicaciones están configuradas en IIS

StanK
fuente
7

Acabo de tener este problema, pero solo cuando publiqué en mi sitio web, en mi depuración local funcionó bien. Descubrí que tenía que usar el FTP de mi webhost e ir a mi directorio de publicación y eliminar los archivos en la carpeta BIN, eliminarlos localmente no hizo nada cuando publiqué.

Mech0z
fuente
Esta fue la solución para mí. Mi perfil de publicación no eliminó los archivos que no están presentes localmente, por lo que mi aplicación recogió dlls antiguos además de los nuevos y encontró tipos duplicados.
Formulario
1
Cambié el nombre de mi proyecto y reformulé todos los archivos, pero luego recibí este error. Eliminar la carpeta bin también funcionó para mí.
Mauro Valvano
6

Puede haber otro caso con Áreas, incluso si ha seguido todos los pasos de enrutamiento en Áreas (como dar espacios de nombres en la tabla de enrutamiento global), que es:

Es posible que no haya envuelto su (s) Controlador (es) Global (es) en el 'espacio de nombres' que proporcionó en el enrutamiento.

P.ej:

Hecho esto:

public class HomeController : Controller
{

En vez de:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
T Gupta
fuente
Sí, no es suficiente proporcionar un espacio de nombres en MapRoute. El espacio de nombres proporcionado aquí debe coincidir con el espacio de nombres de la clase de controlador. ¡Ahora funciona!
DanKodi
6

También puede obtener el error 500 si agrega su propio ensamblado que contiene el ApiController anulando GetAssemblies de DefaultAssembliesResolver y ya está en la matriz de base.GetAssemblies ()

Caso en punto:

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

Si el código anterior está en el mismo ensamblado que su Controlador, ese ensamblaje estará en la lista dos veces y generará un error 500 ya que la API web no sabe cuál usar.

Allan Elder
fuente
6

si desea resolverlo automáticamente ... puede usar el conjunto de aplicaciones simplemente agregue el siguiente 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
fuente
1
gran solución si tienes los mismos controladores en múltiples proyectos
Ravi Anand
4

Tengo los mismos problemas y nada ayudó. El problema es que en realidad no tengo ningún duplicado, este error aparece después de cambiar el espacio de nombres del proyecto de MyCuteProjecta MyCuteProject.Web.

Al final me di cuenta de que la fuente de error es un global.asaxarchivo: marcado XML, no .cs-codebehind. Verifique el espacio de nombres en él, eso me ayudó.

Arman Hayots
fuente
2

Acabo de eliminar la carpeta 'Bin' del servidor y copié mi bin al servidor, y mi problema se resolvió.

javad hemati
fuente
2

En Route.config

espacios de nombres: nuevo [] {"Appname.Controllers"}

Awais
fuente
1

Descubrimos que recibimos este error cuando hubo un conflicto en nuestra compilación que apareció como una advertencia.

No obtuvimos los detalles hasta que aumentamos Visual Studio -> Herramientas -> Opciones -> Proyectos y soluciones -> Compilar y ejecutar -> Verbosidad de salida de compilación del proyecto MSBuild a Detallado.

Nuestro proyecto es una aplicación web .net v4 y hubo un conflicto entre System.Net.Http (v2.0.0.0) y System.Net.Http (v4.0.0.0). Nuestro proyecto hizo referencia a la versión v2 del archivo desde un paquete (incluido usando nuget). Cuando eliminamos la referencia y agregamos una referencia a la versión v4, la compilación funcionó (sin advertencias) y se solucionó el error.

AnthonyJ
fuente
1

Otra variación de este error es cuando usa resharper y usa algunas opciones de refactorización "automática" que incluyen el cambio de nombre del espacio de nombres. Esto es lo que me pasa. Para resolver un problema con este tipo de escenario, elimine la carpetabin

Sebastian 506563
fuente
Esto me sucedió cuando copié el contenido de 1 proyecto sobre el contenido de otro. Tuve que eliminar los archivos específicos de la carpeta bin
Adriaan Davel
1

Haga clic derecho en el proyecto y seleccione limpiar el proyecto. O bien, vaciar completamente el directorio bin y luego volver a compilar. Esto debería eliminar cualquier ensamblaje sobrante de compilaciones anteriores

VivekDev
fuente
1

En algún momento en una sola aplicación, este problema también aparece. En ese caso, seleccione estas casillas de verificación cuando publique su aplicación ingrese la descripción de la imagen aquí

Umang Patwa
fuente
1

Si pudiera ayudar a otros, también me enfrento a este error. El problema fue causado por una referencia incorrecta en mi sitio web. Por razones desconocidas, mi sitio web se refería a otro sitio web, en la misma solución. Y una vez que elimino esa mala referencia, la cosa comenzó a funcionar correctamente.

Hugo
fuente
0

Si está trabajando en Episerver u otro CMS basado en MVC, es posible que ese nombre de controlador en particular ya haya sido reclamado.

Esto me sucedió al intentar crear un controlador llamado FileUpload.


fuente
0

Estaba enfrentando el problema similar. y la razón principal fue que tenía el mismo controlador en dos áreas diferentes. Una vez que elimine uno de ellos, está funcionando bien.

Lo tengo será útil para usted.

Proyecto de solucion

Satish Kumar sonker
fuente
0

Tengo dos proyectos en una solución con el mismo nombre de controlador. Eliminé la segunda referencia de proyecto en el primer proyecto y el problema está resuelto

Kashif Faraz
fuente
0

He encontrado que este error puede ocurrir con el sitio web tradicional de ASP.NET cuando crea el controlador en un directorio que no es App_Code (a veces Visual Studio lo impide).

Establece el tipo de archivo en "Compilar", mientras que cualquier código agregado a "App_Code" se establece en "Contenido". Si copia o mueve el archivo a App_Code, todavía está configurado como "Compilar".

Sospecho que tiene algo que ver con la operación del Proyecto del sitio web, ya que los proyectos del sitio web no tienen ninguna operación de compilación. Borrar la carpeta bin y cambiar a "Contenido" parece solucionarlo.

Curtis White
fuente