Es wurden mehrere Typen gefunden, die mit dem Controller "Home" übereinstimmen.

318

Ich habe derzeit zwei unabhängige MVC3-Projekte, die online gehostet werden.

Einer funktioniert gut, der andere funktioniert nicht und gibt mir den Fehler:

Es wurden mehrere Typen gefunden, die dem Controller mit dem Namen "Home" entsprechen. Dies kann passieren, wenn die Route, die diese Anforderung bedient ('{controller} / {action} / {id}'), keine Namespaces angibt, um nach einem Controller zu suchen, der der Anforderung entspricht.

Wenn dies der Fall ist, registrieren Sie diese Route, indem Sie eine Überladung der 'MapRoute'-Methode aufrufen, die einen' Namespaces'-Parameter verwendet.

Mein Hoster arbeitet so, dass er mir FTP-Zugriff gewährt und ich in diesem Ordner zwei weitere Ordner habe, einen für jede meiner Anwendungen.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com funktioniert einwandfrei, ich veröffentliche meine Anwendung in meinem lokalen Dateisystem, dann per FTP den Inhalt und es funktioniert.

Wenn ich bar.com hochlade und versuche, bar.com auszuführen, wird das oben genannte Problem ausgelöst und ich kann meine Website nicht verwenden. Während foo.com noch funktioniert .

Sucht bar.com von Controllern ÜBERALL in ftpFolderA2 und findet deshalb einen anderen HomeController ? Wie kann ich ihm sagen, dass er nur im Controller-Ordner so aussehen soll, wie er sollte?

Fakten:

  1. Keine Bereiche verwenden. Dies sind zwei völlig unabhängige Projekte. Ich lege jedes veröffentlichte Projekt in den jeweiligen Ordner. Nichts Besonderes.
  2. Jedes Projekt hat nur 1 HomeController.

Kann jemand bestätigen, dass dies das Problem ist?

Nur Bolivianer hier
quelle
Sehr unklare Frage. Verwenden Sie Bereiche? Tritt das Problem lokal auf?
Darin Dimitrov
1
@Darin: Bearbeitet diese Informationen in.
Nur Bolivianer hier

Antworten:

473

Diese Fehlermeldung tritt häufig auf, wenn Sie Bereiche verwenden und denselben Controller- Namen im Bereich und im Stammverzeichnis haben. Zum Beispiel haben Sie die beiden:

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

Um dieses Problem zu beheben (wie in der Fehlermeldung angegeben), können Sie beim Deklarieren Ihrer Routen Namespaces verwenden. Also in der Hauptroutendefinition in Global.asax:

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

und in deinem ~/Areas/Admin/AdminAreaRegistration.cs:

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

Wenn Sie keine Bereiche verwenden, werden Ihre beiden Anwendungen anscheinend in derselben ASP.NET-Anwendung gehostet, und es treten Konflikte auf, weil Sie dieselben Controller in unterschiedlichen Namespaces definiert haben. Sie müssen IIS so konfigurieren, dass diese beiden als separate ASP.NET-Anwendungen gehostet werden, wenn Sie solche Konflikte vermeiden möchten. Fragen Sie Ihren Hosting-Anbieter danach, wenn Sie keinen Zugriff auf den Server haben.

Darin Dimitrov
quelle
Ich benutze überhaupt keine Bereiche. Dies sind zwei völlig unabhängige Anwendungen, die sich in einem separaten Ordner in einem FTP-Stammordner befinden. Vielleicht sucht meine Anwendung überall nach MVC-Controllern, und diese Reichweite erstreckt sich zufällig auch auf den anderen Home-Controller. Wie kann ich ihm sagen, dass er nirgendwo anders als in seinem eigenen Controller-Ordner suchen und den Rest ignorieren soll?
Nur Bolivianer hier
2
@SergioTapia, es scheint, dass sie ziemlich verwandt mit Ihren Anwendungen sind. Ihr Hosting-Anbieter hat sie in dieselbe ASP.NET-Anwendung eingefügt. Sie müssen ihn bitten, sie in IIS als separate Instanzen aufzuteilen, sonst haben Sie viele Probleme.
Darin Dimitrov
13
Vielen Dank. In ASP MVC 4.0 müssen Sie benannte Argumente wie Namespaces übergeben: new [] {"AppName.Areas.Admin.Controllers"}
om471987
1
+1 - Funktioniert gut. Ich wusste nicht, dass es in Gebieten einen separaten Bereich für die Routenregistrierung gibt. Überall, wo ich hinschaue, scheint es eine gute Antwort von Darin zu geben :)
Travis J
1
Wenn Sie Bereiche verwenden und die Controller mit einem Namespace versehen möchten, müssen Sie sowohl die Routen innerhalb als auch außerhalb des Bereichs mit einem Namespace versehen . Nur der Namespace der Gebietsroute gab mir noch dieses Problem.
Gavin Ward
528

Hier ist ein weiteres Szenario, in dem Sie möglicherweise mit diesem Fehler konfrontiert werden. Wenn Sie Ihr Projekt so umbenennen, dass sich der Dateiname der Assembly ändert, können Sie zwei Versionen Ihrer ASP.NET-Assembly verwenden, die diesen Fehler reproduzieren.

Die Lösung besteht darin, in Ihren binOrdner zu gehen und die alten DLLs zu löschen. (Ich habe versucht, "Projekt neu erstellen", aber das hat sie nicht gelöscht. Überprüfen binSie daher, ob sie verschwunden sind.)

Kirk Woll
quelle
1
Eine andere Variante dieses Fehlers ist, wenn Sie Resharper verwenden und einige "automatische" Refactor-Optionen verwenden, die das Ändern des Namespace-Namens beinhalten. Das ist mir passiert.
Sebastian 506563
5
Wenn Sie dies von einem Azure App-Dienst erhalten, rufen Sie https: // <Ihr_App_Name_Hier> .scm.azurewebsites.net / DebugConsole auf, um sich anzumelden und Dateien zu löschen.
Tom Blodget
5
Thx das war das Problem für mich. Ich habe ein "neues" Projekt erstellt, indem ich ein vorhandenes Projekt in einen neuen Ordner kopiert / eingefügt habe. die alten Build dlls kam mit, Löschen Binärordner wischte es sauber
brando
Ich habe dies beim Verschieben meiner Projektdateien auf ein zweites Laufwerk erhalten. Das Löschen des Bin-Ordners löst das Problem. Seltsamste verdammte Sache.
Roberto Bonini
Nun, das war ein schmerzlich ärgerlicher Fehler mit einer sehr einfachen Lösung. Vielen Dank!
Troy Grosfield
63

In MVC4 & MVC5 ist es ein bisschen anders, verwenden Sie Folgendes

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

und in Bereichen

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );
Entwickler
quelle
Danke für die Hilfe, es funktioniert für mich.
Abhay.Patil
39

Sehen Sie sich das an ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Dann dieses Bild (hoffe du magst meine Zeichnungen)

Geben Sie hier die Bildbeschreibung ein

Tom
quelle
Problem behoben ..! :)
Aruna
1
@ppumkin sag das einem blinden Programmierer. Der Text kann jedoch von Bildschirmlesern gelesen werden
Carlos Muñoz
Hallo Carlos. Ja, ich verstehe die Situation. Es ist schon schwierig, Menschen ohne Sehbehinderung zu erklären. Ich bin mir nicht einmal sicher, ob irgendeine Art von Hilfssoftware in der Lage wäre, jedem Körper gut zu beschreiben, was auf dem Bild vor sich geht. Es macht darauf aufmerksam, dass die Antwort wahrscheinlich einen Text enthalten sollte, der zumindest versucht zu beschreiben, was vor sich geht.
Piotr Kula
32

Was andere gesagt haben, ist richtig, aber für diejenigen, die immer noch das gleiche Problem haben:
In meinem Fall ist es passiert, weil ich ein anderes Projekt kopiert und in etwas anderes umbenannt habe, ABER vorherige Ausgabedateien im binOrdner waren immer noch da ... Und leider Build -> Clean Solutionnach dem Umbenennen des Projekt und Namespaces es entfernt sie nicht ... also löste das manuelle Löschen mein Problem!

Dr. TJ
quelle
2
Ihr Vorschlag hat mich gerettet
Abhimanyu
1
ich auch, danke, sauber bedeutet eigentlich nicht sauber, grrrr
katibaer
1
Danke @DrTJ Das war soooooo frustrierend! Sie erwarten, dass der Dang Clean-Prozess funktioniert, und Erwartungen sind die Wurzel des Scheiterns. Das ersparte mir, meine Haare weiter herauszuziehen!
Mike
28

in Ihrem Projekt bin/Projektordner

Stellen Sie sicher, dass Sie nur Ihre haben Stellen PROJECT_PACKAGENAME.DLL haben

und entfernen Sie ANOTHER_PROJECT_PACKAGENAME.DLL

Das könnte hier versehentlich erscheinen oder Sie benennen Ihr Projekt einfach um

Obst A.Suk
quelle
2
Genau mein Problem. Vielen Dank.
Detilium
Hat für mich gearbeitet! Danke!
5.
Ich hatte den Namen der Assembly geändert und einige alte DLLs im Papierkorb. Danke
apc
Vielen Dank! Ich kann nicht glauben, dass ich etwas so Einfaches verpasst habe.
Vash
25

Überprüfen Sie den Ordner bin, wenn eine andere DLL-Datei in Konflikt mit der homeController-Klasse steht.

Amir Shrestha
quelle
7
Dies hat mich beim Kopieren und Umbenennen eines Projekts gebissen ... das alte Projekt mit dem Namen dll befand sich noch im Papierkorb, eine Bereinigung hat es nicht entfernt ... Ich musste es manuell löschen!
Paul Zahra
2
Das war das Problem für mich. Ein Kollege hat versehentlich einen Verweis von einem Front-End-Projekt auf ein anderes hinzugefügt, wodurch dieses Problem verursacht wurde. Er entfernte den Verweis, sodass Visual Studio auch die DLL-Dateien auf seiner Festplatte entfernte. Ich habe das Update von Git abgerufen, Referenzen waren weg, aber die DLL-Dateien blieben auch nach einer Bereinigung erhalten. Einfach, weil mein VS die Referenz nicht mehr gesehen hat. Aber beim Ausführen sah IIS die Dateien und verwendete sie. Das Entfernen von meiner Festplatte hat geholfen.
Yeronimo
14

Eine andere Lösung besteht darin, einen Standard-Namespace bei ControllerBuilder zu registrieren. Da wir in unserer Hauptanwendung viele Routen und in unseren Bereichen (in denen wir bereits einen Namespace angegeben haben) nur eine einzige generische Route hatten, war dies die einfachste Lösung:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Ben Foster
quelle
Dies war bei mir der Fall. Wenn Sie wirklich mehrere Controller mit demselben Namen haben, ist dies möglicherweise erforderlich, nachdem Sie Ihren Routendefinitionen Namespaces hinzugefügt haben. Zum Beispiel für Ihre Homepage, bei der der Controller und der Bereich nicht explizit vom Pfad ausgewählt werden.
Jason Beck
In dem Projekt, an dem ich arbeite, haben wir ein schlüsselfertiges Haupt-Backoffice mit Bereichen für benutzerdefinierte Kundenarbeit. Jeder hat einen 'Einstellungs'-Controller. Diese Antwort ist eine großartige Alternative, um für jeden Bereich eine Route für den Einstellungscontroller definieren zu müssen.
Derreck Dean
7

Auch wenn Sie keine Bereiche verwenden, können Sie in Ihrer RouteMap dennoch angeben, welcher Namespace verwendet werden soll

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

Es klingt jedoch so, als ob das eigentliche Problem darin besteht, wie Ihre beiden Apps in IIS eingerichtet sind

StanK
quelle
7

Ich hatte gerade dieses Problem, aber erst als ich es auf meiner Website veröffentlichte, lief es bei meinem lokalen Debug einwandfrei. Ich stellte fest, dass ich das FTP von meinem Webhost verwenden und in mein Veröffentlichungsverzeichnis gehen und die Dateien im BIN-Ordner löschen musste. Das lokale Löschen hat bei der Veröffentlichung nichts bewirkt.

Mech0z
quelle
Dies war die Lösung für mich. In meinem Veröffentlichungsprofil wurden keine lokal nicht vorhandenen Dateien entfernt, sodass meine App neben neuen auch alte DLLs aufnahm und doppelte Typen fand.
Form
1
Ich habe meinen Projektnamen geändert und alle Dateien refraktiert, aber dann habe ich diesen Fehler erhalten. Das Löschen des Bin-Ordners hat auch bei mir funktioniert.
Mauro Valvano
6

Es kann einen anderen Fall mit Bereichen geben , in dem Sie alle Schritte beim Routing in Bereichen ausgeführt haben (z. B. die Angabe von Namespaces in der globalen Routing-Tabelle):

Möglicherweise haben Sie Ihre globalen Controller nicht in den 'Namespace' eingeschlossen, den Sie beim Routing angegeben haben.

Z.B:

Hab es getan:

public class HomeController : Controller
{

Anstatt:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
T Gupta
quelle
Ja, es reicht nicht aus, nur einen Namespace in MapRoute bereitzustellen. Der hier bereitgestellte Namespace muss mit dem Namespace der Controller-Klasse übereinstimmen. Jetzt funktioniert es!
DanKodi
6

Sie können den 500-Fehler auch erhalten, wenn Sie Ihre eigene Assembly hinzufügen, die den ApiController enthält, indem Sie GetAssemblies des DefaultAssembliesResolver überschreiben. Dieser befindet sich bereits im Array von base.GetAssemblies ()

Ein typisches Beispiel:

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

Wenn sich der obige Code in derselben Assembly wie Ihr Controller befindet, wird diese Assembly zweimal in der Liste aufgeführt und generiert einen 500-Fehler, da die Web-API nicht weiß, welche verwendet werden soll.

Allan Elder
quelle
6

Wenn Sie es automatisch auflösen möchten, können Sie die Anwendung einfach verwenden und den folgenden Code hinzufügen:

 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
quelle
1
Tolle Lösung, wenn Sie dieselben Controller in mehreren Projekten haben
Ravi Anand
4

Ich habe die gleichen Probleme und nichts hat geholfen. Das Problem ist, dass ich tatsächlich keine Duplikate habe. Dieser Fehler tritt auf, nachdem der Projektnamespace von MyCuteProjectauf umgeschaltet wurdeMyCuteProject.Web .

Am Ende wurde mir klar, dass die Fehlerquelle eine global.asaxDatei ist - XML-Markup, nicht .cs-codebehind. Überprüfen Sie den Namespace darin - das hat mir geholfen.

Arman Hayots
quelle
2

Ich habe gerade den Ordner 'Bin' vom Server gelöscht und meinen Bin auf den Server kopiert, und mein Problem wurde behoben.

javad hemati
quelle
2

In Route.config

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

Awais
quelle
1

Wir haben festgestellt, dass dieser Fehler aufgetreten ist, als in unserem Build ein Konflikt aufgetreten ist, der als Warnung angezeigt wurde.

Wir haben die Details erst erhalten, als wir die Ausführlichkeit der Ausgabe von Visual Studio -> Tools -> Optionen -> Projekte und Lösungen -> Erstellen und Ausführen -> Erstellen von MSBuild-Projekten auf Detailliert erhöht haben.

Unser Projekt ist eine .net v4-Webanwendung und es gab einen Konflikt zwischen System.Net.Http (v2.0.0.0) und System.Net.Http (v4.0.0.0). Unser Projekt hat auf die v2-Version der Datei aus einem Paket verwiesen (einschließlich Nuget). Als wir den Verweis entfernt und einen Verweis auf die v4-Version hinzugefügt haben, hat der Build funktioniert (ohne Warnungen) und der Fehler wurde behoben.

AnthonyJ
quelle
1

Eine andere Variante dieses Fehlers ist, wenn Sie Resharper verwenden und einige "automatische" Refactor-Optionen verwenden, die das Ändern des Namespace-Namens beinhalten. Das ist was mit mir passiert ist. Um das Problem mit dieser Art von Szenario zu lösen, löschen Sie den Ordnerbin

Sebastian 506563
quelle
Dies passierte mir, als ich über den Inhalt eines anderen Projekts in den Inhalt eines Projekts kopierte. Ich musste die spezifischen Dateien aus dem Ordner bin löschen
Adriaan Davel
1

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Projekt bereinigen. Oder leeren Sie das bin-Verzeichnis vollständig und erstellen Sie es erneut. Dies sollte alle verbleibenden Baugruppen aus früheren Builds beseitigen

VivekDev
quelle
1

In einer einzelnen Anwendung tritt dieses Problem auch einige Zeit auf. Aktivieren Sie in diesem Fall dieses Kontrollkästchen, wenn Sie Ihre Anwendung veröffentlichen Geben Sie hier die Bildbeschreibung ein

Umang Patwa
quelle
1

Wenn es anderen helfen könnte, habe ich auch diesen Fehler konfrontiert. Das Problem wurde durch eine falsche Referenz auf meiner Website verursacht. Aus unbekannten Gründen verwies meine Website auf eine andere Website in derselben Lösung. Und sobald ich diese schlechte Referenz entfernt hatte, begann die Sache richtig zu funktionieren.

Hugo
quelle
0

Wenn Sie in Episerver oder einem anderen MVC-basierten CMS arbeiten, stellen Sie möglicherweise fest, dass dieser bestimmte Controllername bereits beansprucht wurde.

Dies ist mir passiert, als ich versucht habe, einen Controller namens zu erstellen FileUpload.


quelle
0

Ich war mit dem ähnlichen Problem konfrontiert. und Hauptgrund war, dass ich den gleichen Controller in zwei verschiedenen Bereichen hatte. Sobald ich den einen von ihnen entferne, funktioniert es gut.

Ich habe es wird hilfreich für Sie.

Projektlösung

Satish Kumar Sonker
quelle
0

Ich habe zwei Projekte in einer Lösung mit demselben Controllernamen. Ich habe die zweite Projektreferenz im ersten Projekt entfernt und das Problem wurde behoben

Kashif Faraz
quelle
0

Ich habe festgestellt, dass dieser Fehler bei herkömmlichen ASP.NET-Websites auftreten kann, wenn Sie den Controller in einem Nicht-App_Code-Verzeichnis erstellen (manchmal verhindert Visual Studio dies).

Der Dateityp wird auf "Kompilieren" gesetzt, während der zu "App_Code" hinzugefügte Code auf "Inhalt" gesetzt wird. Wenn Sie die Datei kopieren oder in App_Code verschieben, wird sie weiterhin als "Kompilieren" festgelegt.

Ich vermute, dass es etwas mit dem Betrieb von Website-Projekten zu tun hat, da Website-Projekte keinen Build-Vorgang haben. Das Löschen des Bin-Ordners und das Ändern in "Inhalt" scheint dies zu beheben.

Curtis White
quelle