如果我們在Global中的Application_Start事件中訪問HttpContext.Current.Request對象,如:
protected void Application_Start() { var url=HttpContext.Current.Request.Url.ToString(); }
只是簡單的想取一下當前網站的URL。在調試的時候一切正常,但當我們把網站發布到IIS上面的時候,如果IIS應該程序池在集成模式,就會是會報“請求在此上下文中不可用”的異常,但如果是經典模式就不會。dudu這篇文章有詳細的說明 http://www.cnblogs.com/dudu/archive/2011/10/14/Application_Start_Context_Request.html
一般來說,解決這個問題,兩個方法:
1.將IIS應用程序池改成經典模式
2.不要在Application_Start中訪問HttpContext.Current.Request對象。
但是在有些特殊情況下,在集成模式下能不能在Application_Start獲取當前站點的URL。
雖然我們不能調用HttpContext.Current.Request對象,但是我們通過System.Web.Hosting.HostingEnvironment.ApplicationID可以獲取IIS站點的部署信息。
通過站點的綁定信息間接獲取網站的URL.
void Application_Start(object sender, EventArgs e) { //var url = HttpContext.Current.Request.Url.ToString(); var url = GetUrl(); // 在應用程序啟動時運行的代碼 BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterOpenAuth(); } private string GetUrl() { string path = System.Web.Hosting.HostingEnvironment.ApplicationID; //值類似於:/LM/W3SVC/3/ROOT string url = string.Empty; try { //如果HttpContext可以訪問就直接返回通過HttpContext獲取的結果 return HttpContext.Current.Request.Url.ToString(); } catch (Exception) { } // 將Path轉換成IIS路徑 path = path.Replace("/LM", "").Replace("/ROOT", ""); string entPath = string.Format("IIS://localhost{0}", path); DirectoryEntry entry = new DirectoryEntry(entPath); if (entry.Properties.Contains("ServerBindings")) { var bingdings = entry.Properties["ServerBindings"].Value.ToString();//得到的結果類似於10.188.188.13:8082: //去掉結尾的 : 號 if (bingdings.EndsWith(":")) { bingdings = bingdings.Substring(0, bingdings.Length - 1); } url = "http://"+bingdings; } return url; }
當然這種方法只適用於我們只需要知道網站域名的情況下,或我們可以確定第一次訪問網站的初始頁面。
