Можно ли запускать маршруты ASP.NET MVC в разных доменах приложений?

StackOverflow https://stackoverflow.com/questions/455620

Вопрос

У меня проблемы с продумыванием решения для следующего. У меня есть блог, который я недавно обновил с веб-форм до MVC. Этот блог доступен как на шведском, так и на английском языках для двух разных доменов и ведется на одном веб-сайте в IIS.

Проблема в том, что мне нужны специфичные для языка URL-адреса на обоих сайтах, например:

Английский: http://codeodyssey.com / Архив / 2009/1/15 / код-одиссея-заместитель следующего главы

шведский: http://codeodyssey.se/arkiv / 2009 / 1/15 / код-одиссея-нашт-капитель

В настоящий момент я заставил это работать, регистрируя 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()
{

}

В данный момент это работает, но я знаю, что это не лучшее решение. Я получил & Элемент уже добавлен. Введите словарь & Quot; ошибка при создании этого приложения, и оно иногда не выглядит стабильным.

Я хотел бы настроить маршруты в Application_Start только так, как они должны, и не нужно очищать их при каждом запросе, как я делаю сейчас. Проблема в том, что объект запроса не существует, и у меня нет возможности узнать, какой из специфических для языка маршрутов мне следует зарегистрировать.

Читал о AppDomain, но не смог найти много примеров того, как использовать его на веб-сайте. Я думал, чтобы пометить что-то вроде этого:

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

Затем регистрируйте маршруты каждого веб-сайта в каждом домене приложения и отправляйте запросы одному из них на основе URL-адреса. Не могу найти примеров того, как работать с доменами приложений таким образом.

Я полностью не в курсе? Или есть лучшее решение для этого?

Это было полезно?

Решение

Среда выполнения ASP.Net управляет доменами приложений для вас, поэтому, вероятно, не стоит создавать домены приложений в вашем коде.

Однако, если вы можете, я бы предложил создать несколько приложений IIS (одно для http://codeodyssey.com и один для http://codeodyssey.se ). Направьте оба приложения в один и тот же каталог на диске. Это даст вам два домена приложений, которые вы ищете.

Затем в своем коде Application_Start вы можете проверить домен и соответственно построить маршруты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top