曲線救國:IIS7集成模式下如何獲取網站的URL


如果我們在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;
        }

 當然這種方法只適用於我們只需要知道網站域名的情況下,或我們可以確定第一次訪問網站的初始頁面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM