私は現在、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フォルダーのみを調べるように指示するにはどうすればよいですか?
事実:
誰かがこれが問題であることを確認できますか?
このエラーメッセージは、エリアを使用していて、エリアとルートの中に同じコントローラ 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を構成する必要があります。サーバーにアクセスできない場合は、ホスティングプロバイダに依頼してください。
これはあなたがこのエラーに直面するかもしれない別のシナリオです。アセンブリのファイル名が変わるようにプロジェクトの名前を変更した場合、このエラーを再現する2つのバージョンのASP.NETアセンブリがある可能性があります。
解決策はあなたのbin
フォルダに行き、古いdllを削除することです。 (私は "Rebuild Project"を試しましたが、それは 'em'を削除しませんでした。bin
をチェックしてそれらが消えていることを確認してください)
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" }
);
これを見て... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas
それからこの絵(私の絵が好きですね)
他の人が言ったことは正しいのですが、それでも同じ問題に直面している人たちのためのものです。
私の場合は、別のプロジェクトをコピーしてnという名前に変更したために起こりましたしかし_ bin
name__フォルダー内の以前の出力ファイルはまだ残っています残念ながら、プロジェクトの名前を変更した後でBuild -> Clean Solution
とそのNamespaces
name__を押しても削除されません... so削除手動で私の問題を解決しました!
HomeControllerクラスと競合する可能性のある別のdllファイルがある場合は、binフォルダを確認してください。
プロジェクトのbin/
フォルダーに
自分だけのPROJECT_PACKAGENAME.DLLがあることを確認してください
削除してANOTHER_PROJECT_PACKAGENAME.DLL
間違ってここに表示されるか、単にプロジェクトの名前を変更してください。
別の解決策は、デフォルトの名前空間をControllerBuilderに登録することです。私たちのメインアプリケーションにはたくさんのルートがあり、私たちのエリアには単一の一般的なルートしかないので(すでに名前空間を指定していた)、これが最も簡単な解決策であることがわかりました。
ControllerBuilder.Current
.DefaultNamespaces.Add("YourApp.Controllers");
私はちょうどこの問題を抱えていましたが、私が自分のウェブサイトに公開したときだけ、私のローカルデバッグでそれはうまく動きました。私は自分のWebホストからFTPを使用して私のpublishディレクトリに入り、BINフォルダ内のファイルを削除しなければならないことに気付きました。
エリアを使用していなくても、RouteMapで使用するネームスペースを指定できます。
routes.MapRoute(
"Default",
"{controller}/{action}",
new { controller = "Home", action = "Index" },
new[] { "NameSpace.OfYour.Controllers" }
);
しかし、実際の問題は、2つのアプリケーションがIISで設定されている方法にあるようです。
Areasで別のケースがあるかもしれません(グローバルルーティングテーブルで名前空間を与えるなど)。
ルーティングで指定した「ネームスペース」でグローバルコントローラをラップしていない可能性があります。
例:
これを完了しました:
public class HomeController : Controller
{
:の代わりに
namespace GivenNamespace.Controllers
{
public class HomeController : Controller
{
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エラーを生成します。
自動的に解決したい場合は、次のコードを追加するだけでアプリケーションアセンブリを使用できます。
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) }
);
同じ悩みを抱えても何もしませんでした。問題は、私が実際に重複していないことです。このエラーは、プロジェクトの名前空間をMyCuteProject
からMyCuteProject.Web
に切り替えた後に表示されます。
結局、エラーの原因はglobal.asax
ファイル - XMLマークアップであり、.cs
-codebehindではないことがわかりました。その中の名前空間を確認してください - それは私を助けました。
Route.configで
名前空間:new [] {"Appname.Controllers"}
サーバから「Bin」フォルダを削除し、自分のbinをサーバにコピーするだけで問題が解決しました。
アプリケーションのbinフォルダに別のDLLがあり、そのDLLがHomeという名前のコントローラ。ただしHomeController
name__とは異なる名前空間にあります。
たとえば、プロジェクトの名前を変更しても、古いプロジェクトからバイナリをコンパイルしたままにしている場合は、クリーンソリューションを選択してソリューションをクリーンにしてもメニューコマンド、古いバイナリは残ります。
古いバイナリのいずれかに同じコントローラ名がある場合(単にプロジェクトのアセンブリ名といくつかの名前空間を変更した場合はその名前になります)、この問題が発生する可能性があります。
あなたがあなたが必要ではないと知っていることをbinフォルダーから他のすべてのアセンブリを削除することを確認してください。
これはビデオのデモです。 https://youtu.be/8Snz2ySTAU8
プロジェクトを右クリックして、プロジェクトをクリーンにするを選択します。それ以外の場合は、binディレクトリを完全に空にしてから再構築します。これにより、以前のビルドから残っていたアセンブリが取り除かれます。
このエラーの他のバリエーションは、resharperを使用していて、ネームスペース名の変更を含む「自動」リファクタリングオプションを使用している場合です。これが私に起こります。このようなシナリオの問題を解決するには、folderbin
を削除してください。
それが他の人を助けることができるならば、私もこのエラーに直面します。問題は私のWebサイトで誤った参照をしたことが原因でした。未知の理由で私のウェブサイトは同じ解決策で、別のウェブサイトを参照していました。そして、私がその悪い参照を削除すると、ものは適切に機能し始めました。
同じコントローラ名を持つ1つのソリューションに2つのプロジェクトがあります。最初のプロジェクトで2番目のプロジェクト参照を削除し、問題を解決しました
Episerver、または他のMVCベースのCMSで作業している場合は、その特定のコントローラ名がすでに要求されていることがわかります。
これは私にFileUpload
という名前のコントローラを作成しようとしたときに起こりました。
このエラーは、App_Code以外のディレクトリにControllerを作成すると、従来のASP.NET Webサイトで発生する可能性があることがわかりました(Visual Studioがこれを妨げることがあります)。
ファイルタイプを "Compile"に設定し、 "App_Code"に追加されたコードは "Content"に設定されます。ファイルをApp_Codeにコピーまたは移動しても、それはまだ「Compile」として設定されています。
Webサイトプロジェクトにはビルド操作がないため、Webサイトプロジェクトの操作に何らかの問題があると思います。binフォルダをクリアして「コンテンツ」に変更すると、問題が解決すると思われます。
警告として表示されたビルドに競合があると、このエラーが発生したことがわかりました。
Visual Studio - >ツール - >オプション - >プロジェクトとソリューション - >ビルドと実行 - > MSBuildプロジェクトのビルド出力の冗長度を詳細に増やすまで詳細はわかりませんでした。
私たちのプロジェクトは、.net v4 Webアプリケーションで、System.Net.Http(v2.0.0.0)とSystem.Net.Http(v4.0.0.0)の間に競合がありました。私たちのプロジェクトはパッケージからのファイルのv2バージョンを参照しました(nugetを使用して含まれています)。参照を削除してv4バージョンへの参照を追加すると、ビルドは(警告なしに)機能し、エラーは修正されました。