it-swarm.com.de

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

Derzeit habe ich 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 mit dem Controller 'Home' übereinstimmen. Diese kann passieren, wenn die Route, die diese Anforderung bedient, __. ('{Controller}/{Aktion}/{ID}') gibt keine zu suchenden Namespaces an für einen Controller, der der Anforderung entspricht. 

Wenn dies der Fall ist, Registrieren Sie diese Route, indem Sie eine Überladung der Methode 'MapRoute' aufrufen das nimmt einen 'Namespaces'-Parameter.

Mein Hoster funktioniert so, dass er mir einen FTP-Zugriff gewährt. In diesem Ordner habe ich zwei weitere Ordner, 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 obige Problem ausgelöst und die Verwendung meiner Website wird verhindert. Während foo.com noch funktioniert .

Sucht bar.com ÜBERALL innerhalb von ftpFolderA2 nach Controllern und sucht deshalb eine andere HomeController? Wie kann ich sagen, dass der Controller-Ordner nur so angezeigt wird, wie er sollte?

Fakten:

  1. Bereiche nicht nutzen. Dies sind zwei VOLLSTÄNDIG unabhängige Projekte. Ich lege jedes veröffentlichte Projekt in den jeweiligen Ordner. Nichts Außergewöhnliches.
  2. Jedes Projekt hat nur 1 HomeController.

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

287

Diese Fehlermeldung tritt häufig auf, wenn Sie Bereiche verwenden und den gleichen Controller Namen innerhalb des Bereichs und der Wurzel haben. Zum Beispiel haben Sie die beiden:

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

Um dieses Problem zu beheben (wie in der Fehlermeldung auf Sie hingewiesen wird), können Sie bei der Deklaration 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, scheint es, als würden Ihre beiden Anwendungen in derselben ASP.NET-Anwendung gehostet. Konflikte treten auf, weil Sie dieselben Controller in verschiedenen Namespaces definieren. Sie müssen IIS so konfigurieren, dass diese beiden als separate ASP.NET-Anwendungen gehostet werden, wenn Sie solche Konflikte vermeiden möchten. Bitten Sie Ihren Hosting-Provider darum, wenn Sie keinen Zugriff auf den Server haben.

441
Darin Dimitrov

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

Die Lösung ist, in Ihren bin-Ordner zu gehen und die alten DLLs zu löschen. (Ich habe "Rebuild Project" ausprobiert, aber das wurde nicht gelöscht. Überprüfen Sie daher unbedingt bin, um sicherzustellen, dass sie verschwunden sind.

503
Kirk Woll

In MVC4 und MVC5 ist es etwas 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" }
            );
56
Developer

Sieh dir 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)

enter image description here

39
Tom

Was andere sagten, ist richtig, aber für diejenigen, die immer noch das gleiche Problem haben:
In meinem Fall passierte es, weil ich ein anderes Projekt kopiert und n in etwas anderes umbenannt hatte, ABERvorherige Ausgabedateien im Ordner bin waren noch da ... Und leider drücken Sie Build -> Clean Solution nach dem Umbenennen des Projekts und seiner Namespaces nicht entfernt sie ... so Löschen sie löste mein Problem manuell!

29
Dr TJ

Überprüfen Sie den Ordner bin , wenn eine andere DLL-Datei vorhanden ist, die möglicherweise einen Konflikt mit der homeController-Klasse verursacht.

22
Amir Shrestha

in Ihrem Projektordner bin/

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

und entfernen Sie ANOTHER_PROJECT_PACKAGENAME.DLL 

das könnte hier versehentlich angezeigt werden oder Sie benennen Ihr Projekt einfach um

18
Sruit A.Suk

Eine andere Lösung besteht darin, einen Standard-Namespace bei ControllerBuilder zu registrieren. Da es in unserer Hauptanwendung viele Routen gab und in unseren Gebieten nur eine einzige generische Route (wo wir bereits einen Namensraum angegeben haben), fanden wir dies als die einfachste Lösung:

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

Ich hatte gerade dieses Problem, aber als ich es auf meiner Website veröffentlichte, lief es in meinem lokalen Debugging einwandfrei. Ich stellte fest, dass ich das FTP von meinem Webhost aus nutzen und in mein Veröffentlichungsverzeichnis gehen und die Dateien im BIN-Ordner löschen musste. Wenn ich sie lokal löschte, tat das nichts, als ich veröffentlicht wurde.

7
Mech0z

Auch wenn Sie keine Bereiche verwenden, können Sie in Ihrer RouteMap noch angeben, welchen 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 die Art ist, wie Ihre zwei Apps in IIS eingerichtet sind

7
StanK

Es könnte einen anderen Fall mitAreasgeben, selbst wenn Sie alle Schritte beim Routing in Areas befolgt haben (z. B. Namensräume in der globalen Routing-Tabelle angeben).

Möglicherweise haben Sie Ihre globalen Controller nicht in 'Namespace' .__ eingepackt. Sie haben in Routing bereitgestellt.

Z.B:

Hab's gemacht:

public class HomeController : Controller
{

Anstatt:

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

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 und sich bereits im Array von base.GetAssemblies () befinden.

Fallbeispiel:

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 der Controller befindet, wird diese Assembly zweimal in der Liste angezeigt und generiert einen Fehler 500, da die Web-API nicht weiß, welche verwendet werden soll.

6
Allan Elder

wenn Sie es automatisch auflösen möchten, können Sie die Anwendungsassembly .___ verwenden. Fügen Sie einfach folgenden Code hinzu:

 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

Bekam den gleichen Ärger und nichts half. Das Problem ist, dass ich tatsächlich keine Duplikate habe. Dieser Fehler erscheint, nachdem der Namensraum des Projekts von MyCuteProject auf MyCuteProject.Web geändert wurde. 

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

4
Arman Hayots

ich habe gerade den Ordner "Bin" vom Server gelöscht und meine Bin auf den Server kopiert.

2
javad hemati

Dies kann auch passieren, wenn Sie ein anderes DLL im Ordner bin Ihrer Anwendung haben und DLL einen Controller mit dem Namen Home hat, der sich jedoch von Ihrem HomeController unterscheidet. .

Wenn Sie beispielsweise den Namen Ihres Projekts geändert haben und die Binärdateien weiterhin aus dem alten Projekt kompiliert haben, bleiben die alten Binärdateien auch dann erhalten, wenn Sie Ihre Projektmappe mit dem Menübefehl Clean Solution bereinigen.

Wenn eine der alten Binärdateien denselben Controllernamen hat (was auch der Fall ist, wenn Sie einfach den Namen der Projektassembly und einige Namespaces geändert haben), kann dieses Problem auftreten.

Stellen Sie sicher, dass Sie alle anderen Assemblys aus dem Ordner bin löschen, von denen Sie wissen, dass sie nicht benötigt werden.

Hier ist eine Video-Demo: https://youtu.be/8Snz2ySTAU8

1
Water Cooler v2

In Route.config

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

1
Awais

Irgendwann in einer einzelnen Anwendung tritt dieses Problem auch auf. Aktivieren Sie in diesem Fall dieses Kontrollkästchen, wenn Sie Ihre Anwendung veröffentlichen - enter image description here

1
Umang Patwa

Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie das Projekt bereinigen aus. Oder leeren Sie das bin-Verzeichnis vollständig und bauen Sie es dann erneut auf. Dies sollte frei von verbleibenden Baugruppen aus vorherigen Builds sein

1
VivekDev

Eine andere Variante dieses Fehlers liegt vor, wenn Sie die Nachschärfung verwenden und einige Optionen für die automatische Umgestaltung verwenden, die das Ändern des Namespaces beinhalten. Das ist was mit mir passiert. Um das Problem mit dieser Art von Szenario zu lösen, löschen Sie den Ordnerbin.

1

Wenn es anderen helfen könnte, habe ich auch diesen Fehler. Das Problem war auf einen falschen Verweis in meiner Website zurückzuführen. Aus unbekannten Gründen verwies meine Website auf eine andere Website, in derselben Lösung .. Und sobald ich diesen schlechten Verweis entfernt habe, begann die Sache richtig arbeiten.

1
Hugo

ich war mit einem ähnlichen Problem konfrontiert. Und der 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 für Sie hilfreich.

 Project Solution

0

Ich habe zwei Projekte in einer Lösung mit gleichem Controller-Namen. Ich habe die zweite Projektreferenz im ersten Projekt entfernt und das Problem wurde gelöst 

0
Kashif Faraz

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

Dies ist mir passiert, als ich versuchte, einen Controller mit dem Namen FileUpload zu erstellen.

0
user1017882

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

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

Ich vermute, es hat etwas mit dem Website-Projekt-Betrieb zu tun, da Website-Projekte keinen Build-Betrieb haben. Das Löschen des Bin-Ordners und das Ändern auf "Inhalt" scheint das Problem zu beheben.

0
Curtis White

Wir haben festgestellt, dass wir diesen Fehler erhalten haben, als in unserem Build ein Konflikt aufgetreten ist, der sich als Warnung herausstellte. 

Wir haben das Detail nicht verstanden, bis wir die Visual Studio -> Tools -> Optionen -> Projekte und Lösungen -> Erstellen und Ausführen -> MSBuild-Projektbuildausgabe auf Ausführlich erweitert 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 verwies auf die v2-Version der Datei aus einem Paket (im Lieferumfang von nuget enthalten). Wenn wir den Verweis entfernt und einen Verweis auf die Version 4 hinzugefügt haben, funktionierte der Build (ohne Warnungen) und der Fehler wurde behoben. 

0
AnthonyJ