Asp.Net MVC 4 プロジェクトで 404 応答を解決できません。4.5 をターゲットとする VS2012 に組み込まれています。
スタンドアロンの DLL に組み込まれた、コンパイル済みのビューとコントローラーがあります。DLL を動的にロードして、コア プロジェクトからそれらを調べることができます。それらのメソッドを呼び出すこともできます。ただし、MVC フレームワークはコントローラーを認識していないようです。私はここに近づいていますが、何かが欠けています。
コントローラーとビューの背景
コントローラーは、スタンドアロン MVC プロジェクトに組み込まれ、から継承されController
ます。そこにはあまり興味深いことはありません。ビューは RazorGenerator を使用し、プロジェクトに存在するクラスになります。
プロジェクトの出力は、コントローラーとビューを正しく含む DLL です。
IPlugin
DLLは、ライブラリ内の別のクラス (コントローラーの一部ではない) で、特定のインターフェイスを実装します。これを と呼びます。
DLL のロード
Visual Studio で管理者として実行し、IIS でホストされているアプリをコンパイルします。プロジェクトをビルドしたら、プラグイン DLL を "Plugins" ディレクトリにドロップします。デバッグせずに (これは後で重要になります)、IE を開いてサイトに移動します。 この時点でアプリはビルドされていますが、実行されることはないため、起動イベントが発生することに注意してください。アプリ プールをリサイクルしても、ここにあるものはすべて一貫しています。
2 つのメソッドを持つStartup
クラスがあり、PreStart
ととをそれぞれPostStart
使用してメソッドを呼び出します。WebActivator.PreApplicationStartMethod
WebActivator.PostApplicationStartMethod
PreStart
私が次のことをする場所です:
- "Plugins" ディレクトリにあるすべてのプラグイン DLL のリストを取得する
- すべてのプラグインをコピーします
AppDomain.CurrentDomain.DynamicDirectory
- 型をロードします...
IPlugin
I が含まれている場合- アセンブリを BuildManager に追加する
- IPlugin を実装するクラスでいくつかのメソッドを呼び出します
「PostStart」では、次のコードを実行します (RazorGenerator.Mvc のコードに基づく):
foreach (var assembly in Modules.Select(m=>m.Value))
{
var engine = new PrecompiledMvcEngine(assembly)
{
UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
};
ViewEngines.Engines.Insert(0, engine);
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
Modules
このコンテキストでは、値が読み込まれたアセンブリであるキーと値のペアです。このコードの目的は、ビューを解決する方法を認識しているアセンブリごとにビュー エンジンを追加することで、MVC がビューを認識できるようにすることです (これは RazorGenerator の一部です)。
私が近くにいることをどのように知るか (しかし明らかに葉巻が欠けている)
IPlugin
RegisterRoutes
ご想像のとおり、インターフェイスを実装する人のためにルートが登録される場所と呼ばれるメソッドを定義します。このメソッドを呼び出すPreStart
と、ルートが追加されます - これらがルート テーブルに存在することを確認しました。たとえば、プラグインで定義されたルートで、メソッドの動的呼び出しによって作成され、PreStart
ルートを調べると、次のようなものが DataToken として表示されます。
Namespaces = Plugin.Name.Controllers
ルートが登録され、アセンブリが読み込まれ、DLL が AppDomain の DynamicDirectory に正しくコピーされていることを確認しました。実行時に動的にロードされるクラスのメンバーを呼び出すことができます。しかし、ルートに一致する URL に移動すると、 404 が返されます。これは「ビューが見つかりませんでした」YSOD ではなく、コントローラーがまったく見つからないことに似ています。
これが私を混乱させる部分です。この時点で何もせずに Visual Studio に戻って F5 キーを押すと、すべてが機能します。
Visual Studio が何らかの方法で私が識別できないコントローラーを認識するようになり、MVC フレームワークがそれを認識しているようです。
最後に、質問
何が足りないのですか? MVC フレームワークにコントローラーを認識させるにはどうすればよいですか?
そして、この時点で、まだこれを読んでいるなら、ありがとう。:)