Frage

Ich habe Probleme mit einer Lösung für die folgende auszudenken. Ich habe ein Blog, das ich vor kurzem von Web-Formularen zu MVC aufgewertet. Der Blog ist avalible in Schwedisch und Englisch auf zwei verschiedene Domänen und ist in der gleichen Website in IIS ausgeführt wird.

Das Problem ist, dass ich die Sprache spezifische URLs auf den beiden Websites möchten, wie folgt aus:

Englisch: http://codeodyssey.com / Archiv / 2009/1/15 / Code-Odyssee-the-next-Kapitel

Schwedisch: http://codeodyssey.se/arkiv / 2009/1/15 / Code-Odyssee-nasta-kapitel

Im Moment habe ich dies durch die Registrierung des Routetable auf jede Anforderung in Abhängigkeit arbeiten gemacht, auf der Domäne genannt wird. Mein Global.asax Sieht so etwas wie diese (nicht der gesamte Code):

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()
{

}

Das funktioniert im Moment, aber ich weiß, dass es nicht eine große Lösung. Ich habe eine bekommen „Item wurde bereits hinzugefügt. Key im Wörterbuch“ Fehler, wenn Sie diese App besagt, und es ist scheint nicht stabil manchmal.

Ich möchte nur meine Routen in Application_Start einrichten, wie sie sollten und sie nicht bei jeder Anfrage zu löschen, die, wie ich es jetzt tue. Das Problem ist, dass das Request-Objekt existiert nicht, und ich habe keine Möglichkeit zu wissen, welche der Sprache spezifischer Routen soll ich mich registrieren.

über die AppDomain gelesen, konnte aber nicht viele Beispiele, wie man es verwenden, auf einer Website finden. I'we gedacht, so etwas Star:

protected void Application_Start()
{
   AppDomain.CreateDomain("codeodyssey.se");
   AppDomain.CreateDomain("codeodyssey.com");
}

Dann die Registrierung als je Websites Routen in jeder Anwendungsdomäne und die Anforderungen an einen von ihnen basierend auf der URL senden. Kann keine Beispiele finden, wie man mit AppDomains auf diese Weise arbeiten.

Bin vollständig erfasse ich weg? Oder gibt es eine bessere Lösung?

War es hilfreich?

Lösung

Die ASP.Net Laufzeit verwaltet AppDomains für Sie, so ist es wahrscheinlich keine gute Idee AppDomains in Ihrem Code zu erstellen.

Allerdings, wenn Sie können, würde ich vorschlagen, mehrere IIS-Anwendungen zu schaffen (eine für http://codeodyssey.com und eine für http://codeodyssey.se ). Richten Sie beiden Anwendungen auf demselben Verzeichnis auf der Festplatte. Dies gibt Ihnen die beiden AppDomains Sie suchen.

Dann in Ihrem Application_Start Code, können Sie die Domain überprüfen und bauen Routen entsprechend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top