Se encontraron varios tipos que coinciden con el controlador llamado ‘Inicio’

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

Uno funciona bien, el otro no funciona, me da el error:

Se encontraron varios tipos que coinciden con el controlador llamado ‘Inicio’. Esto puede suceder si la ruta que brinda servicios a 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 hoster es que él 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 y luego transfiero los contenidos a FTP y funciona.

Cuando lo cargo y trato de ejecutar bar.com, el problema anterior se dispara y me impide usar mi sitio. Todo mientras que foo.com aún funciona .

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

Hechos:

  1. No usando á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?

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 su ~/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 sus dos 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. Pregúntale a tu proveedor de hosting si no tienes acceso al servidor.

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

La solución es ir a la carpeta bin y eliminar los dlls antiguos. (Intenté “Rebuild Project”, pero eso no los eliminó, así que asegúrese de verificar bin para asegurarse de que no estén)

En MVC4 y MVC5 es un poco diferente, use 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 Areas

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

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

Entonces esta imagen (espero que te gusten mis dibujos)

enter image description here

Lo que otros dijeron es correcto, pero para aquellos que todavía 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 carpeta bin todavía estaban allí … Y desafortunadamente, al tocar Build -> Clean Solution después de renombrar el proyecto y sus Namespaces no los elimina … ¡así que eliminarlos resolvió manualmente mi problema!

Verifique la carpeta bin si hay otro archivo dll que pueda haber conflicto con la clase homeController.

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

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

en su bin/ carpeta de proyecto

asegúrese de tener solo su PROJECT_PACKAGENAME.DLL

y eliminar ANOTHER_PROJECT_PACKAGENAME.DLL

que podría aparecer aquí por error o simplemente cambiar el nombre de su proyecto

Aunque no esté usando áreas, aún 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 tus dos aplicaciones están configuradas en IIS

Acabo de tener este problema, pero solo cuando publiqué en mi sitio web, mi depuración local funcionó bien. Descubrí que tenía que usar el FTP de mi servidor web y acceder a mi directorio de publicación y eliminar los archivos en la carpeta BIN, eliminándolos localmente no hice nada cuando publiqué.

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

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

P.ej:

Hecho esto:

 public class HomeController : Controller { 

En lugar de:

 namespace GivenNamespace.Controllers { public class HomeController : Controller { 

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

Caso en punto:

 public class MyAssembliesResolver : DefaultAssembliesResolver { public override ICollection GetAssemblies() { var baseAssemblies = base.GetAssemblies(); var assemblies = new List(baseAssemblies); assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver))); return new List(assemblies); } } 

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

si quiere resolverlo automáticamente … puede usar la aplicación en ensamblador solo 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) } ); 

Tengo el mismo problema y nada me 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 MyCuteProject a MyCuteProject.Web .

Al final me di cuenta de que la fuente de error es un archivo global.asax – XML ​​markup, no .cs -codebehind. Verifique el espacio de nombres en él, eso me ayudó.

Acabo de eliminar la carpeta ‘Bin’ del servidor y copiar mi bin al servidor, y mi problema fue resuelto.

Otra variación de este error es cuando usa el reajuste y utiliza algunas opciones de refactorización “automáticas” que incluyen el cambio del nombre del espacio de nombres. Esto es lo que me sucede a mí. Para resolver el problema con este tipo de escenario, elimine el bin carpeta

En Route.config

espacios de nombres: new [] {“Appname.Controllers”}

Haga clic derecho en el proyecto y seleccione limpiar el proyecto. O bien, vacíe completamente el directorio bin y luego vuelva a comstackr. Esto debería eliminarse de cualquier ensamblaje sobrante de comstackciones anteriores

En algún momento, en una sola aplicación, este problema también aparecerá. En ese caso, seleccione estas casillas de verificación cuando publique su aplicación. enter image description here

Si pudiera ayudar a otros, también me enfrentaría a este error. El problema fue causado por una referencia incorrecta en mi sitio web. Por alguna razón desconocida, mi sitio web estaba refiriendo otro sitio web, en la misma solución. Y una vez que elimino esa mala referencia, la cosa comenzó a funcionar correctamente.

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

No obtuvimos los detalles hasta que aumentamos Visual Studio -> Herramientas -> Opciones -> Proyectos y soluciones -> Construir y ejecutar -> nivel de detalle de la salida de comstackción del proyecto MSBuild.

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 hace referencia a la versión v2 del archivo de un paquete (incluido con nuget). Cuando eliminamos la referencia y agregamos una referencia a la versión v4, la comstackción funcionó (sin advertencias) y se corrigió el error.

Si trabajas en Episerver u otro CMS basado en MVC, es posible que ya hayas reclamado ese nombre de controlador en particular.

Esto me sucedió cuando intentaba crear un controlador llamado FileUpload .

estaba enfrentando el problema similar. y la razón principal fue que tenía el mismo controlador en dos áreas diferentes. una vez que elimino el uno de ellos funciona bien.

Lo tengo será útil para ti.

Proyecto de solución