2010-07-19 53 views
2

我试图从相同的代码库提供多个虚拟主机。我想过的一个想法是将HTTP Host头部作为路由值,因为我不想依赖控制器中的HttpContext,因为它具有单元可测试性。作为路由值的HTTP主机头

我曾计划在控制器基类或类似的东西中暴露此路由值。我试图通过这样的路由值:

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:请求在此上下文中不可用。

任何想法或建议更好的方式来做到这一点,将不胜感激。

回答

3

测试控制器时,应该很好地依赖上下文。路由系统的设计考虑了可测试性,因此您可以设置一个模拟上下文,以便在测试运行时提供正确的URL。

您的代码无法正常工作的原因是因为您正在从全局Application_Start事件中调用该代码,该事件在第一个请求进入之前发生。这意味着此时HttpContext对象不可用。

+0

请求完全是有道理的。谢谢! – Jason 2010-07-19 22:44:07

-1

尝试修改HomeController如下您:不是在现有的Application_Start

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 
}