У меня проблемы с продумыванием решения для следующего. У меня есть блог, который я недавно обновил с веб-форм до MVC. Этот блог доступен как на шведском, так и на английском языках для двух разных доменов и ведется на одном веб-сайте в IIS.
Проблема в том, что мне нужны специфичные для языка 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, но не смог найти много примеров того, как использовать его на веб-сайте. Я думал о том, чтобы сыграть что-то вроде этого:
protected void Application_Start()
{
AppDomain.CreateDomain("codeodyssey.se");
AppDomain.CreateDomain("codeodyssey.com");
}
Затем регистрирует маршруты каждого веб-сайта в каждом домене приложения и отправляет запросы одному из них на основе URL-адреса. Не могу найти примеров того, как работать с доменами приложений таким образом.
Я совершенно не в курсе? Или есть лучшее решение для этого?