異なる AppDomain で ASP.NET MVC ルートを実行することは可能ですか?
-
19-08-2019 - |
質問
以下の解決策を考えるのに問題があります。最近、Web フォームから MVC にアップグレードしたブログを取得しました。このブログは 2 つの異なるドメインでスウェーデン語と英語の両方で利用でき、IIS の同じ Web サイトで実行されています。
問題は、次のように、両方のサイトに言語固有の URL が必要なことです。
英語: http://codeodyssey.com/archive/2009/1/15/code-odyssey-the-next-chapter
スウェーデンの: http://codeodyssey.se/arkiv/2009/1/15/code-odyssey-nasta-kapitel
現時点では、呼び出されるドメインに応じてリクエストごとに RouteTable を登録することで、これが機能するようにしました。私の Global.asax は次のようになります (コード全体ではありません)。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
string archiveRoute = "archive";
if (Thread.CurrentThread.CurrentUICulture.ToString() == "sv-SE")
{
archiveRoute = "arkiv";
}
routes.MapRoute(
"BlogPost",
archiveRoute+"/{year}/{month}/{day}/{slug}",
new { controller = "Blog", action = "ArchiveBySlug" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Error", action = "ResourceNotFound" }
);
}
void Application_BeginRequest(object sender, EventArgs e)
{
//Check whcih domian the request is made for, and store the Culture
string currentCulture = HttpContext.Current.Request.Url.ToString().IndexOf("codeodyssey.se") != -1 ? "sv-SE" : "en-GB";
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(currentCulture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(currentCulture);
RouteTable.Routes.Clear();
RegisterRoutes(RouteTable.Routes);
Bootstrapper.ConfigureStructureMap();
ControllerBuilder.Current.SetControllerFactory(
new CodeOdyssey.Web.Controllers.StructureMapControllerFactory()
);
}
protected void Application_Start()
{
}
これは現時点では機能していますが、優れた解決策ではないことはわかっています。「アイテムはすでに追加されています。」というメッセージが表示されます。このアプリを起動するときに「辞書にキーを入力してください」というエラーが発生し、時々安定していないように見えます。
Application_Start で必要に応じてルートを設定するだけで、現在のようにリクエストごとにルートをクリアする必要はありません。問題は、リクエスト オブジェクトが存在せず、言語固有のルートのどれを登録すべきかを知る方法がないことです。
AppDomain について読んでいましたが、Web サイトでの使用方法に関する例があまり見つかりませんでした。私たちは次のようなものにスターを付けようと考えています:
protected void Application_Start()
{
AppDomain.CreateDomain("codeodyssey.se");
AppDomain.CreateDomain("codeodyssey.com");
}
次に、各 Web サイトのルートを各アプリ ドメインに登録し、URL に基づいていずれかの Web サイトにリクエストを送信します。この方法で AppDomain を操作する方法の例は見つかりません。
私は完全に軌道から外れていますか?それとも、これに対するより良い解決策はありますか?
解決
ASP.Net ランタイムは AppDomain を管理するため、コード内に AppDomain を作成することはおそらく得策ではありません。
ただし、可能であれば、複数の IIS アプリケーション (1 つは http://codeodyssey.com そして1つは http://codeodyssey.se)。両方のアプリケーションがディスク上の同じディレクトリを指すようにします。これにより、探している 2 つの AppDomain が得られます。
次に、Application_Start コードでドメインを確認し、それに応じてルートを構築できます。