Plusieurs types ont été trouvés qui correspondent au contrôleur nommé 'Home'

318

J'ai actuellement deux projets MVC3 non liés hébergés en ligne.

L'un fonctionne bien, l'autre ne fonctionne pas, ce qui me donne l'erreur:

Plusieurs types ont été trouvés qui correspondent au contrôleur nommé 'Home'. Cela peut se produire si la route qui dessert cette demande ('{contrôleur} / {action} / {id}') ne spécifie pas d'espaces de noms pour rechercher un contrôleur qui correspond à la demande.

Si tel est le cas, enregistrez cette route en appelant une surcharge de la méthode 'MapRoute' qui prend un paramètre 'namespaces'.

La façon dont mon hébergeur fonctionne, c'est qu'il me donne un accès FTP et dans ce dossier, j'ai deux autres dossiers, un pour chacune de mes applications.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com fonctionne très bien, je publie mon application sur mon système de fichiers local puis FTP le contenu et ça marche.

Lorsque je télécharge et essaie d'exécuter bar.com, le problème ci-dessus se déclenche et m'empêche d'utiliser mon site. Pendant que foo.com fonctionne toujours .

Bar.com recherche-t-il des contrôleurs PARTOUT dans ftpFolderA2 et c'est pourquoi il en trouve un autre HomeController? Comment puis-je lui dire de ne regarder que dans le dossier Controller comme il se doit?

Les faits:

  1. Ne pas utiliser de zones. Ce sont deux projets ENTIÈREMENT indépendants. Je place chaque projet publié dans chaque dossier respectif. Rien d'extraordinaire.
  2. Chaque projet n'a qu'un seul HomeController.

Quelqu'un peut-il confirmer que c'est le problème?

Seulement bolivien ici
la source
Question très floue. Utilisez-vous des zones? Le problème se produit-il localement?
Darin Dimitrov
1
@Darin: Modification de ces informations dans.
Seulement bolivien ici

Réponses:

473

Ce message d'erreur se produit souvent lorsque vous utilisez des zones et que vous avez le même nom de contrôleur à l'intérieur de la zone et de la racine. Par exemple, vous avez les deux:

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

Afin de résoudre ce problème (comme le message d'erreur vous le suggère), vous pouvez utiliser des espaces de noms lors de la déclaration de vos itinéraires. Donc, dans la définition de l'itinéraire principal dans Global.asax:

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

et dans votre ~/Areas/Admin/AdminAreaRegistration.cs:

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

Si vous n'utilisez pas de zones, il semble que vos deux applications sont hébergées dans la même application ASP.NET et des conflits se produisent car vous avez les mêmes contrôleurs définis dans des espaces de noms différents. Vous devrez configurer IIS pour héberger ces deux applications distinctes ASP.NET si vous souhaitez éviter ce type de conflits. Demandez à votre hébergeur si vous n'avez pas accès au serveur.

Darin Dimitrov
la source
Je n'utilise pas du tout de zones. Ce sont deux applications complètement indépendantes résidant dans un dossier séparé à l'intérieur d'un dossier racine FTP. Peut-être que mon application recherche des contrôleurs MVC partout où elle peut et que cette portée se trouve s'étendre à l'autre contrôleur domestique. Comment puis-je lui dire de ne regarder nulle part mais que c'est son propre dossier Controller et de ne pas tenir compte du reste?
Seulement bolivien ici
2
@SergioTapia, il semble qu'ils soient assez liés à vos applications. Votre hébergeur les a placés dans la même application ASP.NET. Vous devrez lui demander de les diviser dans IIS en tant qu'instances distinctes ou vous aurez beaucoup de problèmes.
Darin Dimitrov
13
Merci. Dans ASP MVC 4.0, vous devez passer un argument nommé comme des espaces de noms: new [] {"AppName.Areas.Admin.Controllers"}
om471987
1
+1 - Fonctionne bien. Je ne savais pas qu'il y avait une zone distincte pour l'enregistrement des itinéraires dans les zones. Partout où je regarde, il semble qu'il y ait une réponse de qualité de Darin :)
Travis J
1
Si vous utilisez des zones et que vous voulez namespace les contrôleurs, vous devez namespace les deux routes à l' intérieur de la région et à l' extérieur. Seul l'espace de noms de l'itinéraire de la zone m'a toujours posé ce problème.
Gavin Ward
528

Voici un autre scénario où vous pourriez rencontrer cette erreur. Si vous renommez votre projet afin que le nom de fichier de l'assembly change, il vous est possible d'avoir deux versions de votre assembly ASP.NET, qui reproduiront cette erreur.

La solution est d'aller dans votre bindossier et de supprimer les anciennes DLL. (J'ai essayé "Rebuild Project", mais cela ne les a pas supprimés, alors assurez-vous de vérifier binqu'ils sont partis)

Kirk Woll
la source
1
Une autre variante de cette erreur est lorsque vous utilisez resharper et que vous utilisez des options de refactorisation "auto" qui incluent le changement de nom d'espace de noms. C'est ce qui m'est arrivé.
Sebastian 506563
5
Si vous obtenez cela d'un Azure App Service, accédez à https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole pour vous connecter et supprimer des fichiers.
Tom Blodget
5
Thx c'était le problème pour moi. J'avais créé un "nouveau" projet en copiant / collant un projet existant dans un nouveau dossier; les anciennes DLL de construction sont venues avec, la suppression du dossier bin l'a effacé
brando
Je l'ai obtenu lors du déplacement de mes fichiers de projet vers un deuxième lecteur. Vider le dossier bin le résout. La chose la plus étrange.
Roberto Bonini
Eh bien, c'était une erreur douloureusement ennuyeuse avec une solution très simple. Merci!
Troy Grosfield
63

Dans MVC4 et MVC5, c'est un peu différent, utilisez ce qui suit

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

et dans les zones

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

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

Ensuite, cette image (j'espère que vous aimez mes dessins)

entrez la description de l'image ici

À M
la source
Résolu le problème ..! :)
Aruna
1
@ppumkin dit ça à un programmeur aveugle. Le texte peut être lu par les lecteurs d'écran
Carlos Muñoz
Salut Carlos. Oui, je comprends la situation. Il est déjà difficile de l'expliquer aux personnes sans handicap de visibilité. Je ne suis même pas sûr qu'un logiciel d'assistance puisse décrire ce qui se passe dans l'image bien à n'importe quel corps. Cela met en évidence que la réponse devrait probablement contenir un texte essayant au moins de décrire ce qui se passe.
Piotr Kula
32

Ce que les autres ont dit est correct, mais pour ceux qui sont toujours confrontés au même problème:
dans mon cas, cela s'est produit parce que j'ai copié un autre projet n le renommé en quelque chose d'autre MAIS les fichiers de sortie précédents dans le bindossier étaient toujours là ... Et malheureusement, frapper Build -> Clean Solutionaprès avoir renommé le projet et son Namespaces ne les supprime pas ... donc les supprimer manuellement a résolu mon problème!

Dr TJ
la source
2
votre suggestion m'a sauvé
Abhimanyu
1
moi aussi, merci, propre dosnt signifie réellement propre, grrrr
katibaer
1
Merci @DrTJ C'était tellement frustrant! Vous vous attendez à ce que le processus dang clean fonctionne et les attentes sont à l'origine de l'échec. Cela m'a évité de tirer mes cheveux plus loin!
Mike
28

dans votre bin/dossier de projet

assurez-vous que vous n'avez que votre PROJECT_PACKAGENAME.DLL

et supprimez ANOTHER_PROJECT_PACKAGENAME.DLL

qui pourrait apparaître ici par erreur ou vous renommez simplement votre projet

Sruit A.Suk
la source
2
Exactement mon problème. Je vous remercie.
Detilium
A travaillé pour moi! merci!
eyal
J'avais changé le nom de l'assemblage et j'avais quelques vieilles DLL dans le bac. Merci
apc
Je vous remercie! Je ne peux pas croire que j'ai raté quelque chose d'aussi simple.
Vash
25

Vérifiez le dossier bin s'il existe un autre fichier dll qui peut avoir des conflits avec la classe homeController.

Amir Shrestha
la source
7
Cela m'a mordu en copiant un projet et en le renommant ... l'ancien projet nommé dll était toujours dans le bac, un nettoyage ne l'a pas supprimé ... J'ai dû le supprimer manuellement!
Paul Zahra
2
C'était le problème pour moi. Un collègue a ajouté par erreur une référence d'un projet frontal à un autre créant ce problème. Il a supprimé la référence, Visual Studio supprimant ainsi également les fichiers dll sur son disque. J'ai retiré la mise à jour de Git, les références avaient disparu, mais les fichiers dll sont restés, même après un nettoyage. Tout simplement parce que mon VS ne voyait plus la référence. Mais lors de l'exécution, IIS a vu les fichiers et les a utilisés. Les supprimer de mon disque a aidé.
Yeronimo
14

Une autre solution consiste à enregistrer un espace de noms par défaut avec ControllerBuilder. Comme nous avions beaucoup de routes dans notre application principale et une seule route générique dans nos régions (où nous spécifions déjà un espace de noms), nous avons trouvé que c'était la solution la plus simple:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Ben Foster
la source
Ce fut le cas pour moi. Si vous avez vraiment plusieurs contrôleurs avec le même nom, cela peut être nécessaire après avoir ajouté des espaces de noms à vos définitions de route. Par exemple, pour votre page d'accueil où le contrôleur et la zone ne sont pas explicitement choisis par le chemin.
Jason Beck
Dans le projet sur lequel je travaille, nous avons un backoffice principal clé en main avec des zones pour le travail client personnalisé. Chacun a un contrôleur de «paramètres». Cette réponse est une excellente alternative à la définition d'un itinéraire pour le contrôleur de paramètres pour chaque zone.
Derreck Dean
7

Même si vous n'utilisez pas de zones, vous pouvez toujours spécifier dans votre RouteMap quel espace de noms utiliser

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

Mais il semble que le problème réel soit la façon dont vos deux applications sont configurées dans IIS

StanK
la source
7

Je viens d'avoir ce problème, mais seulement lorsque j'ai publié sur mon site Web, sur mon débogage local, cela s'est bien passé. J'ai trouvé que je devais utiliser le FTP de mon hébergeur et aller dans mon répertoire de publication et supprimer les fichiers dans le dossier BIN, les supprimer localement n'a rien fait lorsque j'ai publié.

Mech0z
la source
C'était la solution pour moi. Mon profil de publication n'a pas supprimé les fichiers non présents localement, donc mon application a récupéré les anciennes DLL en plus des nouvelles et a trouvé des types en double.
Formulaire
1
J'ai changé le nom de mon projet et j'ai réfractoré tous les fichiers mais j'ai eu cette erreur. La suppression du dossier bin a également fonctionné pour moi.
Mauro Valvano
6

Il peut y avoir un autre cas avec les zones même si vous avez suivi toutes les étapes du routage dans les zones (comme donner des espaces de noms dans la table de routage globale), qui est:

Vous n'avez peut-être pas encapsulé vos contrôleurs globaux dans l '«espace de noms» que vous avez fourni lors du routage.

Par exemple:

Fait ceci:

public class HomeController : Controller
{

Au lieu de:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
T Gupta
la source
Oui, il ne suffit pas de simplement fournir un espace de noms dans MapRoute. L'espace de noms fourni ici doit correspondre à l'espace de noms de la classe de contrôleur. Maintenant, cela fonctionne!
DanKodi
6

Vous pouvez également obtenir l'erreur 500 si vous ajoutez votre propre assembly qui contient l'ApiController en remplaçant GetAssemblies du DefaultAssembliesResolver et il est déjà dans le tableau à partir de base.GetAssemblies ()

Exemple concret:

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 le code ci-dessus se trouve dans le même assembly que votre Controller, cet assembly sera dans la liste deux fois et générera une erreur 500 car l'API Web ne sait pas laquelle utiliser.

Allan Elder
la source
6

si vous voulez le résoudre automatiquement .. vous pouvez utiliser l'application simplement ajouter simplement le code suivant:

 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
la source
1
excellente solution si vous avez les mêmes contrôleurs dans plusieurs projets
Ravi Anand
4

J'ai le même problème et rien n'a aidé. Le problème est que je n'ai en fait aucun doublon, cette erreur apparaît après le basculement de l'espace de noms du projet MyCuteProjectvers MyCuteProject.Web.

À la fin, j'ai réalisé que la source d'erreur est un global.asaxfichier - un balisage XML, pas .cs-codebehind. Vérifiez l'espace de noms dedans - cela m'a aidé.

Arman Hayots
la source
2

Je viens de supprimer le dossier 'Bin' du serveur et de copier mon bac sur le serveur, et mon problème est résolu.

javad hemati
la source
2

Dans Route.config

espaces de noms: nouveau [] {"Appname.Controllers"}

Awais
la source
1

Nous avons constaté que nous obtenions cette erreur lors d'un conflit dans notre build qui s'est présenté comme un avertissement.

Nous n'avons pas obtenu les détails jusqu'à ce que nous ayons augmenté le niveau de détail de Visual Studio -> Tools -> Options -> Projects and Solutions -> Build and Run -> MSBuild project build output verbosity.

Notre projet est une application Web .net v4 et il y avait un conflit entre System.Net.Http (v2.0.0.0) et System.Net.Http (v4.0.0.0). Notre projet a référencé la version v2 du fichier à partir d'un package (inclus à l'aide de nuget). Lorsque nous avons supprimé la référence et ajouté une référence à la version v4, la construction a fonctionné (sans avertissements) et l'erreur a été corrigée.

AnthonyJ
la source
1

Une autre variante de cette erreur est lorsque vous utilisez resharper et que vous utilisez des options de refactorisation "auto" qui incluent le changement de nom d'espace de noms. C'est ce qui m'arrive. Pour résoudre le problème avec ce type de dossier de suppression de scénariobin

Sebastian 506563
la source
Cela m'est arrivé lorsque j'ai copié le contenu d'un projet sur le contenu d'un autre. J'ai dû supprimer les fichiers spécifiques du dossier bin
Adriaan Davel
1

Cliquez avec le bouton droit sur le projet et sélectionnez nettoyer le projet. Sinon, videz complètement le répertoire bin, puis reconstruisez-le à nouveau. Cela devrait supprimer tous les assemblages restants des versions précédentes

VivekDev
la source
1

Parfois, dans une seule application, ce problème survient Dans ce cas, cochez cette case lorsque vous publiez votre application entrez la description de l'image ici

Umang Patwa
la source
1

Si cela pouvait aider les autres, j'ai également fait face à cette erreur. Le problème est dû à une référence incorrecte dans le site Web de moi. Pour une raison inconnue, mon site Web faisait référence à un autre site Web, dans la même solution. Et une fois que j'ai supprimé cette mauvaise référence, la chose a commencé à fonctionner correctement.

Hugo
la source
0

Si vous travaillez dans Episerver ou dans un autre CMS basé sur MVC, vous pouvez constater que ce nom de contrôleur particulier a déjà été revendiqué.

Cela m'est arrivé lors de la tentative de création d'un contrôleur appelé FileUpload.


la source
0

j'étais confronté au même problème. et la raison principale était que j'avais le même contrôleur dans deux zones différentes. une fois que j'enlève l'un d'eux, cela fonctionne bien.

je l'ai vous sera utile.

Solution de projet

Satish Kumar sonker
la source
0

J'ai deux projets dans une solution avec le même nom de contrôleur. J'ai supprimé la deuxième référence de projet dans le premier projet et le problème est résolu

Kashif Faraz
la source
0

J'ai trouvé que cette erreur peut se produire avec le site Web ASP.NET traditionnel lorsque vous créez le contrôleur dans un répertoire non App_Code (parfois Visual Studio empêche cela).

Il définit le type de fichier sur "Compiler" tandis que tout code ajouté à "App_Code" est défini sur "Contenu". Si vous copiez ou déplacez le fichier dans App_Code, il est toujours défini comme "Compiler".

Je soupçonne que cela a quelque chose à voir avec le fonctionnement du projet de site Web, car les projets de site Web n'ont aucune opération de génération. Effacer le dossier bin et passer à "Contenu" semble le corriger.

Curtis White
la source