「ホーム」という名前のコントローラーに一致する複数のタイプが見つかりました


318

現在、オンラインでホストされている無関係な2つのMVC3プロジェクトがあります。

1つは正常に動作し、もう1つは動作しないため、エラーが発生します。

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

その場合は、「namespaces」パラメーターを受け取る「MapRoute」メソッドのオーバーロードを呼び出して、このルートを登録します。

私のホスティング業者の仕事のやり方は、彼が私にFTPアクセスを与え、そのフォルダーに私のアプリケーションごとに1つずつ、他に2つのフォルダーがあります。

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.comは正常に機能します。アプリケーションをローカルファイルシステムに公開し、コンテンツをFTPで転送すると機能します。

bar.comをアップロードして実行しようとすると、上記の問題が発生し、自分のサイトを使用できなくなります。foo.comは引き続き機能します。

bar.comはftpFolderA2内のどこからでもコントローラから検索しており、それが別のものを見つけている理由HomeControllerです。コントローラーフォルダーのみを検索するようにするにはどうすればよいですか?

事実:

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

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


非常に不明確な質問。エリアを使用していますか?問題はローカルで発生しますか?
Darin Dimitrov

1
@Darin:編集その内の情報。
ここでの唯一のボリビア

回答:


473

このエラーメッセージはエリアを使用してい、エリアとルート内に同じコントローラー名がある場合によく発生します。たとえば、次の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を構成する必要があります。サーバーにアクセスできない場合は、ホスティングプロバイダーにお問い合わせください。


エリアは一切使用していません。これらは、FTPルートフォルダー内の別のフォルダーに存在する2つのまったく関係のないアプリケーションです。たぶん、私のアプリケーションはMVCコントローラーをあらゆる場所で探しているため、他のホームコントローラーにも及ぶ可能性があります。どのようにしてどこも見ないように指示することはできますが、それは独自のControllerフォルダーであり、残りは無視しますか?
ボリビアのみ

2
@SergioTapia、彼らはあなたのアプリケーションにかなり関連しているようです。ホスティングプロバイダーは、同じASP.NETアプリケーション内にそれらを配置します。IISでそれらを個別のインスタンスとして分割するように彼に依頼する必要があります。そうしないと多くの問題が発生します。
Darin Dimitrov、

13
ありがとう。ASP MVC 4.0では、名前空間のような名前付き引数を渡す必要があります:new [] {"AppName.Areas.Admin.Controllers"}
om471987

1
+1-うまくいきます。エリアごとに別のルート登録エリアがあることを知りませんでした。どこを見ても、ダーリンからの質の高い答えがあるようです:)
Travis J

1
あなたが領域を使用しているとコントローラを名前空間にしたい場合は、名前空間に必要な両方の領域内のルート外側を。エリアルートの名前空間のみで、この問題が発生しました。
ギャビンワード

528

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

解決策は、binフォルダーに移動して古いdllを削除することです。(「Rebuild Project」を試してみましたが、削除されませんでした。削除されていることを確認binしてください)


1
このエラーの他のバリエーションは、resharperを使用し、名前空間名の変更を含むいくつかの「自動」リファクタリングオプションを使用する場合です。これは私に起こったことでした。
セバスチャン506563

5
これをAzure App Serviceから取得している場合は、https:// <your_app_name_here> .scm.azurewebsites.net / DebugConsoleにアクセスしてログインし、ファイルを削除します。
トムブロジェット2016年

5
これは私にとって問題でした。既存のプロジェクトを新しいフォルダーにコピー/貼り付けして、「新しい」プロジェクトを作成しました。古いビルドDLLが付属し、binフォルダーを削除するとそれが
完全

これは、プロジェクトファイルを2番目のドライブに移動したときに発生しました。binフォルダーを空にすることで解決します。奇妙なこと。
Roberto Bonini

まあそれは非常に単純な修正で痛々しい迷惑なエラーでした。ありがとう!
Troy Grosfield、2017

63

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

39

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

次に、この写真(私の絵が好きだと思います)

ここに画像の説明を入力してください


問題を解決しました。:)
Aruna 14

1
@ppumkinは、それを盲人プログラマに伝えます。テキストにはかかわらず、スクリーンリーダーで読むことができる
カルロス・ムニョス

こんにちはカルロス。はい私は状況を理解しています。視覚障害のない人々にそれを説明することはすでに厳しいです。どんな種類の支援ソフトウェアも、写真で何が起こっているのかをどんな身体にもうまく説明できるかどうかさえ私にはわかりません。答えはおそらく少なくとも何が起こっているのかを説明しようとするテキストを持つべきだということに注意を向けさせます。
Piotr Kula

32

どのような他の人が言ったことは正しいが、それでも同じ問題に直面している人のためのものです:
私は別のプロジェクトをコピーnは何か他のものにそれを名前を変更したので、私の場合それは起こったBUTの前の出力ファイルbin打つ、残念ながらフォルダがまだそこにいた...そして、Build -> Clean Solution名前を変更した後プロジェクトを削除しても削除されNamespaces ないので、手動で削除すると問題が解決しました。


2
あなたの提案が私を救った
Abhimanyu 2015

1
私も、おかげで、きれいなdosntは実際にはきれいな、grrrrを意味します
katibaer

1
ありがとう@DrTJこれはとてもうんざりしました!ダンクリーンプロセスが機能することを期待し、期待が失敗の根源です。これにより、髪の毛をさらに抜くことができました。
マイク、

28

プロジェクトbin/フォルダ内

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

そして、ANOTHER_PROJECT_PACKAGENAME.DLLを削除します

誤ってここに表示されるか、プロジェクトの名前を変更するだけです


2
まさに私の問題です。ありがとうございました。
Detilium 2018

私のために働いた!よーし!
eyal

アセンブリ名を変更し、古いDLLをビンに入れていました。ありがとう
apc

ありがとうございました!とてもシンプルなものを見逃したなんて信じられません。
Vash

25

homeControllerクラスと競合している可能性のある別のdllファイルがあるかどうか、binフォルダーを確認してください。


7
これは、プロジェクトをコピーして名前を変更するときに私に噛み付きました... dllという名前の古いプロジェクトはまだビンにあり、クリーンアップで削除できませんでした...手動で削除する必要がありました!
Paul Zahra 14年

2
これは私にとって問題でした。同僚が誤って、あるフロントエンドプロジェクトから別のプロジェクトへの参照を追加して、この問題を引き起こしました。彼は参照を削除したため、Visual Studioもディスク上のdllファイルを削除しました。Gitから更新をプルしましたが、参照はなくなりましたが、dllファイルはクリーン後も残りました。単に私のVSが参照をもう見なかったからです。しかし、IISを実行すると、ファイルが表示されて使用されました。私のディスクからそれらを削除するのに役立ちました。
イエロニモ2018

14

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

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");

これは私にとって事実でした。本当に同じ名前のコントローラが複数ある場合は、ルート定義に名前空間を追加した後でこれが必要になることがあります。たとえば、コントローラーとエリアがパスによって明示的に選択されていないホームページの場合などです。
Jason Beck

私が取り組んでいるプロジェクトでは、カスタムクライアントの作業領域を持つメインのターンキーバックオフィスがあります。それぞれに「設定」コントローラーがあります。この回答は、エリアごとに設定コントローラーのルートを定義する必要がある場合の優れた代替手段です。
デレックディーン

7

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

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

しかし、実際の問題は、IISで2つのアプリを設定する方法にあるようです


7

私はこの問題を抱えていましたが、自分のWebサイトに公開したときにのみ、ローカルデバッグで問題なく実行されました。私は自分のWebホストからFTPを使用し、公開ディレクトリに移動してBINフォルダー内のファイルを削除する必要があることに気付きました。公開したときにローカルで削除しても何も起こりませんでした。


これは私にとっての修正でした。私の公開プロファイルはローカルに存在しないファイルを削除しなかったので、私のアプリは新しいDLLに加えて古いDLLを取得し、重複したタイプを見つけました。
フォームの

1
プロジェクト名を変更し、すべてのファイルを再屈折させましたが、このエラーが発生しました。binフォルダーの削除も私にとってはうまくいきました。
Mauro Valvano 2016年

6

エリアのルーティングですべての手順を実行した場合でも、グローバルルーティングテーブルで名前空間を指定するなど、別のケースが発生する可能性があります。

ルーティングで指定した「名前空間」にグローバルコントローラをラップしていない可能性があります。

例えば:

これを行います:

public class HomeController : Controller
{

の代わりに:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

はいMapRouteで名前空間を提供するだけでは十分ではありません。ここで提供される名前空間は、コントローラークラスが存在する名前空間と一致する必要があります。これで機能します!
DanKodi 2016年

6

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回含まれ、どのAPIを使用するかWeb APIが認識しないため、500エラーが生成されます。


6

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

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

1
複数のプロジェクトで同じコントローラを使用している場合の優れたソリューション
Ravi Anand

4

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

最終的に、エラーの原因がglobal.asaxファイルであることに.cs気づきました。XMLマークアップではなく、コードビハインドです。その中の名前空間を確認してください—それは私を助けました。


2

サーバーからフォルダー 'Bin'を削除し、ビンをサーバーにコピーしたところ、問題は解決しました。



1

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

Visual Studio-> Tools-> Options-> Projects and Solutions-> Build and Run-> MSBuild project build output verbosity to Detailedを増やすまで、詳細は得られませんでした。

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


1

このエラーの他のバリエーションは、resharperを使用し、名前空間名の変更を含むいくつかの「自動」リファクタリングオプションを使用する場合です。これが私に起こります。この種のシナリオの問題を解決するには、フォルダーを削除しますbin


これは、あるプロジェクトのコンテンツに別のプロジェクトのコンテンツをコピーしたときに起こりました。特定のファイルをbinフォルダーから削除する必要がありました
Adriaan Davel

1

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


1

単一のアプリケーションでしばらくすると、この問題も発生します。その場合、アプリケーションを公開するときにこれらのチェックボックスを選択します ここに画像の説明を入力してください


1

それが他の人を助けることができるなら、私もこのエラーに直面しました。この問題は、私のWebサイトで誤った参照が行われたことが原因でした。不明な理由で、私のWebサイトは同じソリューションで別のWebサイトを参照していました。そして、その悪い参照を削除すると、物事は適切に機能し始めました。


0

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

というコントローラを作成しようとしたときに、これが起こりましたFileUpload


0

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

私はそれがあなたのために役立つでしょう。

プロジェクトソリューション


0

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


0

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

「App_Code」に追加されたコードはすべて「Content」に設定されるのに対して、ファイルタイプは「コンパイル」に設定されます。ファイルをApp_Codeにコピーまたは移動すると、「コンパイル」として設定されます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.