web-dev-qa-db-fra.com

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

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

L'un fonctionne bien, l'autre ne fonctionne pas, me donnant l'erreur:

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

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

La façon dont mon hébergeur fonctionne 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 bien, je publie mon application sur mon système de fichiers local, puis FTP le contenu et cela fonctionne.

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

Bar.com effectue-t-il des recherches partout dans ftpFolderA2 auprès des contrôleurs? C’est pourquoi il trouve un autre HomeController? Comment puis-je lui demander de ne regarder que dans le dossier Contrôleur comme il se doit?

Faits:

  1. Ne pas utiliser les zones. Ce sont deux projets COMPLETEMENT non liés. Je place chaque projet publié dans chaque dossier respectif. Rien d'extraordinaire.
  2. Chaque projet ne comporte qu’un seul HomeController.

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

287
Only Bolivian Here

Ce message d'erreur se produit souvent lorsque vous utilisez des zones et que vous avez le même contrôleur nom à 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 le suggère), vous pouvez utiliser des espaces de nom lors de la déclaration de vos itinéraires. Donc, dans la définition de route principale 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 soient 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 différents espaces de noms. Vous devrez configurer IIS pour héberger ces deux applications en tant qu'applications ASP.NET distinctes si vous souhaitez éviter ce type de conflit. Demandez-le à votre fournisseur d’hébergement si vous n’avez pas accès au serveur.

441
Darin Dimitrov

Voici un autre scénario où vous pourriez confronter cette erreur. Si vous renommez votre projet pour que le nom de fichier de l'Assemblée soit modifié, il est possible que vous disposiez de deux versions de votre Assemblée ASP.NET, ce qui reproduira cette erreur. 

La solution consiste à accéder à votre dossier bin et à supprimer les anciennes DLL. (J'ai essayé "Rebuild Project", mais cela ne les a pas supprimés, alors assurez-vous de vérifier bin pour vous assurer qu'ils sont partis)

503
Kirk Woll

Dans MVC4 & MVC5 C'est un peu différent, utilisez le suivant 

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

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

Puis cette photo (j'espère que vous aimez mes dessins)

enter image description here

39
Tom

Ce que les autres ont dit est correct mais pour ceux qui sont toujours confrontés au même problème:
Dans mon cas, c’est parce que j’ai copié un autre projet et que j’ai renommé autre choseMAISles fichiers de sortie précédents du dossier bin étaient toujours là ... Et malheureusement, frapper Build -> Clean Solution après avoir renommé le projet et sa Namespaces ne supprime pas les ... donc la suppression les a résolu manuellement mon problème!

29
Dr TJ

Vérifiez le dossier bin s'il existe un autre fichier dll pouvant être en conflit avec la classe homeController.

22
Amir Shrestha

dans votre dossier de projet bin/

assurez-vous de n'avoir que votre PROJECT_PACKAGENAME.DLL

et supprimez ANOTHER_PROJECT_PACKAGENAME.DLL  

cela peut apparaître ici par erreur ou vous venez de renommer votre projet

18
Sruit A.Suk

Une autre solution consiste à enregistrer un espace de noms par défaut auprès de ControllerBuilder. Comme nous avions de nombreux itinéraires dans notre application principale et un seul itinéraire générique dans nos zones (où nous spécifions déjà un espace de nom), nous avons constaté que cette solution était la plus simple:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
14
Ben Foster

Je viens d'avoir ce problème, mais seulement lorsque j'ai publié sur mon site Web, le débogage local s'est bien déroulé. J'ai découvert que je devais utiliser le FTP de mon hébergeur, accéder à mon répertoire de publication et supprimer les fichiers du dossier BIN. Les supprimer localement ne faisait rien lorsque je publiais.

7
Mech0z

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

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

Mais il semble que le véritable problème réside dans la configuration de vos deux applications dans IIS.

7
StanK

Il pourrait y avoir un autre cas avecAreasmê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), à ​​savoir:

Vous n'avez peut-être pas encapsulé votre (vos) contrôleur (s) global (s) dans 'l'espace de noms' vous avez fourni dans le routage.

Par exemple:

Fait ceci:

public class HomeController : Controller
{

Au lieu de:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
6
T Gupta

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

Exemple:

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 assemblage que votre contrôleur, cet assemblage apparaîtra deux fois dans la liste et générera une erreur 500 puisque l’API Web ne sait pas lequel utiliser.

6
Allan Elder

si vous voulez le résoudre automatiquement, vous pouvez utiliser l’assemblage de l’application .___. Ajoutez 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) }
        );
5
Xtremexploit

Vous avez le même problème et rien n'a aidé. Le problème est que je n'ai pas de doublons. Cette erreur apparaît après le basculement de l'espace de noms du projet de MyCuteProject à MyCuteProject.Web

En fin de compte, j'ai réalisé que la source d'erreur est un fichier global.asax - un balisage XML, pas .cs- codebehind. Vérifier l'espace de noms qu'il contient m'a aidé. 

4
Arman Hayots

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

2
javad hemati

Dans Route.config

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

1
Awais

Dans la même application, cochez cette case lorsque vous publiez votre application enter image description here

1
Umang Patwa

Cliquez avec le bouton droit sur le projet et sélectionnez Nettoyer le projet. Ou alors vider complètement le répertoire bin puis reconstruire à nouveau. Cela devrait effacer tous les assemblages restants des versions précédentes

1
VivekDev

Une autre variante de cette erreur survient lorsque vous utilisez resharper et que vous utilisez certaines options de refactorisation "auto" qui incluent le changement de nom d'espace de nom. C'est ce qui m'arrive. Pour résoudre le problème avec ce type de scénario, supprimez le dossierbin

1
Sebastian 506563

Si cela peut aider les autres, j'ai aussi faire face à cette erreur. Le problème était dû à une référence incorrecte sur mon site Web .. 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, travaille correctement.

1
Hugo

Cela peut également se produire si vous avez un autre DLL dans le dossier bin de votre application et que DLL possède un contrôleur nommé Accueil mais dans un espace de noms différent de votre HomeController. .

Par exemple, si vous avez modifié le nom de votre projet et que les fichiers binaires ont toujours été compilés à partir de l'ancien projet, même lorsque vous nettoyez votre solution en sélectionnant la commande Nettoyer la solution menu, les anciens fichiers binaires resteront.

Si l'un des anciens fichiers binaires a le même nom de contrôleur (ce qui sera le cas, si vous modifiez simplement le nom de votre assemblée de projet et quelques espaces de noms), vous risquez d'avoir ce problème.

Assurez-vous de supprimer tous les autres assemblys du dossier bin dont vous savez que vous n’avez pas besoin.

Voici une démo vidéo: https://youtu.be/8Snz2ySTAU8

0
Water Cooler v2

je faisais face 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'entre eux ça fonctionne bien. 

je l'ai utile pour vous.

 Project Solution

0
Satish Kumar sonker

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 

0
Kashif Faraz

Si vous travaillez dans Episerver ou 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é lorsque j'ai tenté de créer un contrôleur appelé FileUpload.

0
user1017882

J'ai constaté 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 l'empêche).

Il définit le type de fichier sur "Compiler" alors 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 qu'il en va de même pour le fonctionnement du projet de site Web, car les projets de site Web ne comportent aucune opération de construction. Supprimer le dossier bin et passer à "Contenu" semble résoudre le problème.

0
Curtis White

Nous avons constaté que nous avions cette erreur lorsqu’il y avait un conflit dans notre construction qui s’est présenté comme un avertissement. 

Nous n'avons pas eu les détails jusqu'à ce que nous ayons augmenté Visual Studio -> Outils -> Options -> Projets et solutions -> Construire et exécuter -> Projet de construction du projet MSBuild détaillé en détail. 

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 fonctionnait (sans avertissements) et l'erreur a été corrigée. 

0
AnthonyJ