2013-04-11 37 views
2

最近,我問這個:C#IIS 7基地址

Get Base URL of My Web Application

這個工作在一定程度上在調試,因爲我用的是VS開發服務器。

我那麼產生的安裝,安裝,然後將指向IIS 7

我:

void Application_Start(object sender, EventArgs e) 
    { 
     _baseUrl = HttpContext.Current.Request.Url.ToString(); 
     .... 
    } 

但是,這引發了以下錯誤:

請求不在可用這方面

然後,我做了一些閱讀,這裏是爲什麼發生這種情況:

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart

我然後移動的代碼從出向的Application_Start的Application_BeginRequest,使用上述如我發現的Application_BeginRequest正在執行幾次的技術。

但問題是我需要IIS 7的基本URL,在的Application_Start使用,所以我有一個全局的字符串我試圖設置:

FirstRequestInitialization.Initialize(context); 

但不是surpriseingly嘗試此時:

Application["BaseUrl"] = HttpContext.Current.Request.Url.ToString(); 

我得到這個錯誤: 'Microsoft.Web.Administration.Application' 是 '型',而是使用類似 '變量'

我要的是IIS 7的基本URL

我不能使用目錄條目,因爲我不能支持IIS 6

我怎樣才能做到這一點?任何解決方法?我可以從VS執行AppCmd嗎?

任何幫助非常感謝。謝謝!

回答

4

簡短的回答:你不能得到它,因爲網站沒有一個規範的基礎URI - 一個網站(或者說,一個web應用程序)可以配置爲回答任何綁定請求,任何域名,以及任何資源路徑 - 並且可以在主機網絡服務器(IIS)中重新配置網站,而不會讓應用程序意識到這一點。

如果你真的要存儲「基礎URL」(即使這樣的事情是不存在的),那麼你可以從Application_BeginRequest內做到這一點,像這樣:

private static readonly Object _arbitraryUrlLock = new Object(); 
private static volatile String _arbitraryUrl; 

public void Application_BeginRequest() { 
    if(_arbitraryUrl == null) 
     lock(_arbitraryUrlLock) 
      if(_arbitraryUrl == null) 
       _arbitraryUrl = HttpContext.Current.Request.Url.ToString(); 
} 
+0

我想補充以下評論你想檢查_arbitraryUrl在執行鎖之前是否爲空,並且只有在鎖爲空時才執行該鎖,否則就會不必要地鎖定每個請求。 – 2013-04-11 17:19:31

+0

Thansk,趕上! – Dai 2013-04-11 20:05:01

+0

感謝Dai,CarlosAg,我想在應用程序啓動時在IIS7中爲所有應用程序創建超鏈接,這就是爲什麼我需要基本URL。 – 2013-04-11 20:19:08