web-dev-qa-db-ja.com

'Home'という名前のコントロールに一致する複数のタイプが見つかりました

私は現在、2つの関係のないMVC3プロジェクトをオンラインでホストしています。

1つはうまく機能しますが、もう1つは機能しません。エラーが発生します。

'Home'という名前のコントローラに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート( '{controller}/{action}/{id}')がリクエストに一致するコントローラを検索するための名前空間を指定していない場合に発生する可能性があります。

その場合は、 'namespaces'パラメータを取る 'MapRoute'メソッドのオーバーロードを呼び出してこのルートを登録してください。

私のホスティング会社が機能する方法は、彼が私にFTPアクセスを許可し、そのフォルダーに私が他の2つのフォルダーを持っているということです。

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.comはうまく動作します、私は自分のアプリケーションを自分のローカルファイルシステムに公開し、それからコンテンツをFTPで送信します。

Bar.comをアップロードして実行しようとすると、上記の問題が発生し、自分のサイトを使用できなくなります。 foo.comがまだ動作している間はすべて

Bar.comはftpFolderA2の中のどこからでもコントローラから検索しています、そしてそれはそれが別のHomeControllerを見つけている理由ですか?本来の方法でControllerフォルダーのみを調べるように指示するにはどうすればよいですか?

事実:

  1. エリアを使用していません。これらは2つの全く無関係なプロジェクトです。公開された各プロジェクトをそれぞれのフォルダーに配置します。空想は何もない。
  2. 各プロジェクトには1つのHomeControllerしかありません。

誰かがこれが問題であることを確認できますか?

295

このエラーメッセージは、エリアを使用していて、エリアとルートの中に同じコントローラ nameがある場合によく発生します。たとえば、2つあります。

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

この問題を解決するには(エラーメッセージが示すように)、ルートを宣言するときに名前空間を使用できます。だからGlobal.asaxのメインルート定義では:

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

そしてあなたの~/Areas/Admin/AdminAreaRegistration.csに:

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

エリアを使用していない場合は、両方のアプリケーションが同じASP.NETアプリケーション内でホストされており、同じコントローラが異なる名前空間で定義されているために競合が発生しているようです。このような競合を避けたい場合は、これら2つを別々のASP.NETアプリケーションとしてホストするようにIISを構成する必要があります。サーバーにアクセスできない場合は、ホスティングプロバイダに依頼してください。

451
Darin Dimitrov

これはあなたがこのエラーに直面するかもしれない別のシナリオです。アセンブリのファイル名が変わるようにプロジェクトの名前を変更した場合、このエラーを再現する2つのバージョンのASP.NETアセンブリがある可能性があります。

解決策はあなたのbinフォルダに行き、古いdllを削除することです。 (私は "Rebuild Project"を試しましたが、それは 'em'を削除しませんでした。binをチェックしてそれらが消えていることを確認してください)

510
Kirk Woll

MVC4とMVC5では少し違いますが、以下を使用してください

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

そして地域で

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

これを見て... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

それからこの絵(私の絵が好きですね)

enter image description here

39
Tom

他の人が言ったことは正しいのですが、それでも同じ問題に直面している人たちのためのものです。
私の場合は、別のプロジェクトをコピーしてnという名前に変更したために起こりましたしかし_ binname__フォルダー内の以前の出力ファイルはまだ残っています残念ながら、プロジェクトの名前を変更した後でBuild -> Clean SolutionとそのNamespacesname__を押しても削除されません... so削除手動で私の問題を解決しました!

29
Dr TJ

HomeControllerクラスと競合する可能性のある別のdllファイルがある場合は、binフォルダを確認してください。

23
Amir Shrestha

プロジェクトのbin/フォルダーに

自分だけのPROJECT_PACKAGENAME.DLLがあることを確認してください

削除してANOTHER_PROJECT_PACKAGENAME.DLL

間違ってここに表示されるか、単にプロジェクトの名前を変更してください。

21
Sruit A.Suk

別の解決策は、デフォルトの名前空間をControllerBuilderに登録することです。私たちのメインアプリケーションにはたくさんのルートがあり、私たちのエリアには単一の一般的なルートしかないので(すでに名前空間を指定していた)、これが最も簡単な解決策であることがわかりました。

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

私はちょうどこの問題を抱えていましたが、私が自分のウェブサイトに公開したときだけ、私のローカルデバッグでそれはうまく動きました。私は自分のWebホストからFTPを使用して私のpublishディレクトリに入り、BINフォルダ内のファイルを削除しなければならないことに気付きました。

7
Mech0z

エリアを使用していなくても、RouteMapで使用するネームスペースを指定できます。

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

しかし、実際の問題は、2つのアプリケーションがIISで設定されている方法にあるようです。

7
StanK

Areasで別のケースがあるかもしれません(グローバルルーティングテーブルで名前空間を与えるなど)。

ルーティングで指定した「ネームスペース」でグローバルコントローラをラップしていない可能性があります。

例:

これを完了しました:

public class HomeController : Controller
{

:の代わりに

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

DefaultAssembliesResolverのGetAssembliesをオーバーライドすることによってApiControllerを含む独自のアセンブリを追加し、それがbase.GetAssemblies()の配列に既にある場合は、500エラーを受け取ることもあります

適例:

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

上記のコードがコントローラと同じアセンブリ内にある場合、そのアセンブリはリストに2回含まれ、Web APIはどちらを使用するかわからないため500エラーを生成します。

6
Allan Elder

自動的に解決したい場合は、次のコードを追加するだけでアプリケーションアセンブリを使用できます。

 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

同じ悩みを抱えても何もしませんでした。問題は、私が実際に重複していないことです。このエラーは、プロジェクトの名前空間をMyCuteProjectからMyCuteProject.Webに切り替えた後に表示されます。

結局、エラーの原因はglobal.asaxファイル - XMLマークアップであり、.cs-codebehindではないことがわかりました。その中の名前空間を確認してください - それは私を助けました。

4
Arman Hayots

Route.configで

名前空間:new [] {"Appname.Controllers"}

2
Awais

サーバから「Bin」フォルダを削除し、自分のbinをサーバにコピーするだけで問題が解決しました。

2
javad hemati

アプリケーションのbinフォルダに別のDLLがあり、そのDLLがHomeという名前のコントローラ。ただしHomeControllername__とは異なる名前空間にあります。

たとえば、プロジェクトの名前を変更しても、古いプロジェクトからバイナリをコンパイルしたままにしている場合は、クリーンソリューションを選択してソリューションをクリーンにしてもメニューコマンド、古いバイナリは残ります。

古いバイナリのいずれかに同じコントローラ名がある場合(単にプロジェクトのアセンブリ名といくつかの名前空間を変更した場合はその名前になります)、この問題が発生する可能性があります。

あなたがあなたが必要ではないと知っていることをbinフォルダーから他のすべてのアセンブリを削除することを確認してください。

これはビデオのデモです。 https://youtu.be/8Snz2ySTAU8

1
Water Cooler v2

単一のアプリケーションでこの問題も発生する場合がありますその場合は、アプリケーションを公開するときにこれらのチェックボックスをオンにしますenter image description here

1
Umang Patwa

プロジェクトを右クリックして、プロジェクトをクリーンにするを選択します。それ以外の場合は、binディレクトリを完全に空にしてから再構築します。これにより、以前のビルドから残っていたアセンブリが取り除かれます。

1
VivekDev

このエラーの他のバリエーションは、resharperを使用していて、ネームスペース名の変更を含む「自動」リファクタリングオプションを使用している場合です。これが私に起こります。このようなシナリオの問題を解決するには、folderbinを削除してください。

1

それが他の人を助けることができるならば、私もこのエラーに直面します。問題は私のWebサイトで誤った参照をしたことが原因でした。未知の理由で私のウェブサイトは同じ解決策で、別のウェブサイトを参照していました。そして、私がその悪い参照を削除すると、ものは適切に機能し始めました。

1
Hugo

私は同様の問題に直面していました。そして主な理由は、私が2つの異なるエリアで同じコントローラーを持っていたということでした。私はそれらのうちの1つを削除したらその正常に動作します。

私はあなたに役立つでしょう。

Project Solution

0

同じコントローラ名を持つ1つのソリューションに2つのプロジェクトがあります。最初のプロジェクトで2番目のプロジェクト参照を削除し、問題を解決しました

0
Kashif Faraz

Episerver、または他のMVCベースのCMSで作業している場合は、その特定のコントローラ名がすでに要求されていることがわかります。

これは私にFileUploadという名前のコントローラを作成しようとしたときに起こりました。

0
user1017882

このエラーは、App_Code以外のディレクトリにControllerを作成すると、従来のASP.NET Webサイトで発生する可能性があることがわかりました(Visual Studioがこれを妨げることがあります)。

ファイルタイプを "Compile"に設定し、 "App_Code"に追加されたコードは "Content"に設定されます。ファイルをApp_Codeにコピーまたは移動しても、それはまだ「Compile」として設定されています。

Webサイトプロジェクトにはビルド操作がないため、Webサイトプロジェクトの操作に何らかの問題があると思います。binフォルダをクリアして「コンテンツ」に変更すると、問題が解決すると思われます。

0
Curtis White

警告として表示されたビルドに競合があると、このエラーが発生したことがわかりました。

Visual Studio - >ツール - >オプション - >プロジェクトとソリューション - >ビルドと実行 - > MSBuildプロジェクトのビルド出力の冗長度を詳細に増やすまで詳細はわかりませんでした。

私たちのプロジェクトは、.net v4 Webアプリケーションで、System.Net.Http(v2.0.0.0)とSystem.Net.Http(v4.0.0.0)の間に競合がありました。私たちのプロジェクトはパッケージからのファイルのv2バージョンを参照しました(nugetを使用して含まれています)。参照を削除してv4バージョンへの参照を追加すると、ビルドは(警告なしに)機能し、エラーは修正されました。

0
AnthonyJ