私は次の解決策を考えるのに問題があります。最近、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");
}
次に、各アプリドメインの各ウェブサイトルートを登録し、URLに基づいてそれらの1つにリクエストを送信します。この方法でAppDomainsを操作する方法の例が見つかりません。
私は完全に軌道に乗っていないのですか?または、これに対するより良い解決策はありますか?