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
}