HTTP主机头作为路由值

时间:2010-07-19 20:37:13

标签: asp.net-mvc asp.net-mvc-2

我正在尝试从相同的代码库中提供多个虚拟主机。我有一个想法是将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 个答案:

答案 0 :(得分:3)

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

您的代码不起作用的原因是因为您正在尝试从第一个请求进入之前发生的全局Application_Start事件中调用它。这意味着当时HttpContext对象不可用。 / p>

答案 1 :(得分:-1)

尝试修改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
}