質問

以下の解決策を考えるのに問題があります。最近、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 コードでドメインを確認し、それに応じてルートを構築できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top