Asp.net mvc HTTP主机头作为路由值
我试图从同一个代码库为多个虚拟主机提供服务。我的一个想法是将HTTP主机头作为路由值传递,因为由于单元可测试性,我不想在控制器中依赖HttpContext 我曾计划在控制器基类或类似的东西中公开这个路由值。我尝试将传递作为路线值,如下所示:Asp.net mvc HTTP主机头作为路由值,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我试图从同一个代码库为多个虚拟主机提供服务。我的一个想法是将HTTP主机头作为路由值传递,因为由于单元可测试性,我不想在控制器中依赖HttpContext 我曾计划在控制器基类或类似的东西中公开这个路由值。我尝试将传递作为路线值,如下所示: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { host = HttpContext.Cur
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:请求在此上下文中不可用
如果您对更好的方法有任何想法或建议,我们将不胜感激。在测试控制器时,您可以根据上下文进行测试。路由系统的设计考虑到了可测试性,因此您可以设置一个模拟上下文,在测试运行时提供正确的URL
代码无法工作的原因是,您可能正在从全局
应用程序\u 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
}
应用程序启动时请求不可用完全有道理。谢谢