Domanda

Sto riscontrando problemi nel trovare una soluzione per quanto segue. Ho ottenuto un blog che ho recentemente aggiornato da moduli Web a MVC. Il blog è disponibile in svedese e in inglese su due domini diversi e viene eseguito nello stesso sito Web in IIS.

Il problema è che vorrei URL specifici della lingua su entrambi i siti, in questo modo:

Inglese: http://codeodyssey.com / archive / 2009/1/15 / code-odissea-the-next-capitolo

Svedese: http://codeodyssey.se/arkiv / 2009/1/15 / code-odissea-Nasta-kapitel

Al momento l'ho fatto funzionare registrando la RouteTable su ogni richiesta a seconda del dominio chiamato. My Global.asax Assomiglia a qualcosa del genere (non l'intero codice):

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

}

Questo funziona al momento, ma so che non è un'ottima soluzione. Ho ricevuto un " L'articolo è già stato aggiunto. Digita nel dizionario " errore quando si afferma questa app e a volte non sembra stabile.

Vorrei solo impostare i miei percorsi in Application_Start come dovrebbero e non doverli cancellare su ogni richiesta come sto facendo ora. Il problema è che l'oggetto richiesta non esiste e non ho modo di sapere quale delle rotte specifiche della lingua dovrei registrare.

Ho letto AppDomain ma non ho trovato molti esempi su come usarlo su un sito web. Ho pensato di recitare in qualcosa del genere:

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

Quindi registrando i percorsi di ciascun sito Web in ciascun dominio dell'app e inviando le richieste a uno di essi in base all'URL. Non riesco a trovare esempi su come lavorare con AppDomains in questo modo.

Sono completamente fuori strada? O c'è una soluzione migliore per questo?

È stato utile?

Soluzione

Il runtime ASP.Net gestisce AppDomain per te, quindi probabilmente non è una buona idea creare AppDomain nel tuo codice.

Tuttavia, se possibile, suggerirei di creare più applicazioni IIS (una per http://codeodyssey.com e uno per http://codeodyssey.se ). Puntare entrambe le applicazioni sulla stessa directory sul disco. Questo ti darà i due AppDomain che stai cercando.

Quindi, nel tuo codice Application_Start, puoi controllare il dominio e creare i percorsi di conseguenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top