HTTP-заголовок хоста как значение маршрута

Я пытаюсь обслуживать несколько виртуальных хостов из одной базы кода. У меня была мысль передать заголовок HTTP Host в качестве значения маршрута, потому что я не хотел полагаться на HttpContext в контроллерах из-за тестируемости модуля.

Я планировал выставить значение этого маршрута в базовом классе контроллера или что-то в этом роде. Я попытался передать значение маршрута следующим образом:

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { host = HttpContext.Current.Request.Url.Host, controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Это приводит к HttpException: Запрос не доступен в этом контексте.

Будем благодарны за любые идеи или предложения по лучшему способу сделать это.

2 ответа

Решение

Вы должны хорошо полагаться на контекст при тестировании вашего контроллера. Система маршрутизации была разработана с учетом тестируемости, поэтому вы можете установить фиктивный контекст, который обеспечивает правильный URL-адрес при выполнении ваших тестов.

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

Попробуйте изменить ваш HomeController следующее:

public ActionResult Index() {
    var request = HttpContext.Request.Url;

    if (request != null && request.AbsoluteUri.Contains("domain.com")) {
        //take the desired action and redirect here
    }

    //the rest of home controller logic
}
Другие вопросы по тегам