É possível executar rotas ASP.NET MVC em diferentes AppDomains?
-
19-08-2019 - |
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?
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.