2010-07-19 56 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 
}