_ __ _ _______更新_____ _ __ _ ___ _ _ _ _
カスタムControllerFactoryの問題を解決するために、別の角度からアプローチしました。以下の回答を参照してください。
_ _______元の質問_____ _ __ _ _
複数のブランド展開に使用されるMVCコードベースがあります。各クライアントの要求を満たすために、オーバーライド可能なコントローラーとビューを設定しました。
ルート登録は次のようになります
protected void Application_Start()
{
string deploymentName = GetDeploymentName();
RouteConfig.RegisterRoutes(RouteTable.Routes, deploymentName);
}
RegisterRoutes内で、最初にデプロイメント名前空間で一致するコントローラーを探します。見つからない場合は、ベース名前空間を探します。
これは、展開ごとに個別のIISアプリケーションが設定されている場合は正常に機能します。これは、展開ごとに独自のApplication_Start()が実行されるためです。
ただし、1つのIISサイトインスタンスですべての展開を実行しようとしています。つまり、Application_Start()は1回だけ呼び出され、最初のデプロイメントでのみルートが登録されてヒットします。
RegisterRoutesをApplication_Start()からSession_Start()やApplication_PreRequestHandlerExecute()のようなものに移動しようとしています
protected void Application_PreRequestHandlerExecute()
{
string deploymentName = GetDeploymentName();
using (RouteTable.Routes.GetWriteLock())
{
RouteTable.Routes.Clear();
RouteConfig.RegisterRoutes(RouteTable.Routes, deploymentName);
}
}
このコードを使用すると、各リクエストは現在のデプロイメント名前空間を取得し、ルートテーブルをクリアして、新しい名前空間を使用してルートを再登録します。
2つの問題:
1:以前のルートが何であれ、リクエストは引き続き実行されます。したがって、この時点での要求はすでに特定のコントローラーとアクションに向けられているため、私はライフサイクルの間違った部分にいます。
2:次のリクエストは例外をスローします:
例外の詳細:System.InvalidOperationException:「ホーム」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート('{controller} / {action} / {id}')が、リクエストに一致するコントローラーを検索するための名前空間を指定していない場合に発生する可能性があります。この場合は、「namespaces」パラメーターを受け取る「MapRoute」メソッドのオーバーロードを呼び出して、このルートを登録します。
以前のルートの登録を解除しましたが、アプリケーションは以前に登録したコントローラーにハングアップしているようです。同じ名前の別のコントローラーに別のルートを登録したため、2つのコントローラーの間にあいまいさがあります。
私の2つの主な質問は次のとおりです。
1.リクエストが既存のルートに解決される前に新しいルートを登録するために使用できるApplication_Start()以外のライフサイクルイベントはありますか?
2.以前に登録したコントローラーであいまいな例外が発生しないように、ルートとコントローラーを完全にクリアするにはどうすればよいですか。