Pergunta

Estou tendo problemas com pensando em uma solução para o seguinte. Eu tenho um blog que eu recentemente atualizado a partir de formulários web para MVC. O blog é avalible em ambos sueco e Inglês em dois domínios diferentes e estão funcionando no mesmo site no IIS.

O problema é que eu gostaria urls específicos de idiomas no ambos os sites, como este:

Inglês: http://codeodyssey.com / Arquivo / 2009/1/15 / code-odisséia-the-next-capítulo

sueco: http://codeodyssey.se/arkiv / 2009/1/15 / code-odisséia-Nasta-kapitel

No momento eu fiz isso para trabalho de registrar o RouteTable em cada pedido, dependendo de qual domínio é chamado. Meu Global.asax é algo como isto (não todo o código):

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

}

Isso funciona no momento, mas eu sei que não é uma boa solução. Fui ficando um "Item já foi adicionado. Chave no dicionário" erro ao afirmar-se este aplicativo e ele não parece estável, às vezes.

Gostaria de definir apenas os meus rotas na Application_Start como deveriam e não ter que limpá-los em cada solicitação como eu estou fazendo agora. O problema é que o objeto do pedido não existe e eu não tenho nenhuma maneira de saber qual das rotas específicas de linguagem devo registar.

lido sobre o AppDomain mas não conseguiu encontrar muitos exemplos sobre como usá-lo em um web site. I'we sido o pensamento de estrela algo como isto:

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

Então registring cada web sites rotas em cada domínio de aplicativo e enviar os pedidos a um deles com base na url. Não é possível encontrar alguns exemplos de como trabalhar com AppDomains dessa maneira.

Am I completamente a noção de folga? Ou há uma solução melhor para isso?

Foi útil?

Solução

O tempo de execução ASP.Net administra AppDomains para você, então o seu provavelmente não é uma boa ideia para criar AppDomains em seu código.

No entanto, se você puder, eu gostaria de sugerir a criação de múltiplos IIS Applications (um para http://codeodyssey.com e um para http://codeodyssey.se ). Aponte os dois aplicativos ao mesmo diretório no disco. Isto lhe dará os dois AppDomains que você está procurando.

Então, em seu código Application_Start, é possível verificar as rotas de domínio e construir em conformidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top