2009-11-24 216 views
12

任何人都可以告訴我是否有辦法讓我在Global.asax的Application_Start事件中獲取我的站點的域名?全球ASAX - 獲取服務器名稱

通常我只是從Context.Request.ServerVariables [「SERVER_NAME」]得到它,但這是不可用的。理想情況下,我也喜歡從啓動應用程序的請求中獲取URL。


嗯 - 從下面的答案,似乎IIS7在這裏有所作爲。這是新的,現在有設計準則,以嘗試和做它阻止你:

IIS Blog

回答

21

您可以通過靜態HttpContext.Current成員訪問Context

HttpContext.Current.Request.ServerVariables["SERVER_NAME"]; 
HttpContext.Current.Request.Url; 

編輯,根據你的一些意見,我做了一些額外的研究

這個錯誤是由於在IIS7集成管道,使得在Application_Start事件無法請求上下文中的設計更改。使用經典模式(在先前版本的IIS上運行時的唯一模式)時,儘管Application_Start事件一直被認爲是應用程序生命週期中的全局和請求不可知事件,但請求上下文過去常常可用。儘管如此,由於ASP.NET應用程序始終是通過對應用程序的第一個請求啓動的,因此通過靜態HttpContext.Current字段可以訪問請求上下文。

所以,你有兩個選擇

  1. 更改應用程序代碼不使用請求上下文(推薦)。
  2. 將應用程序移至經典模式(不推薦)。

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

+2

我不認爲這是在的Application_Start – Luk

+2

@Luk一個的HttpContext:我通過替換它固定它。無論你在什麼範圍內都無所謂。它就在那裏。如果您遇到問題,請完全限定它System.Web.HttpContext.Current – Bob

+4

如果我這樣做,我會得到一個運行時錯誤,指出該請求在此上下文中不可用。資質沒有任何區別。 – Paddy

-3

您是否嘗試過: -

System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] 

感謝,

菲爾。

+0

+1奇怪的是,即使在'Application_Start'中,HttpContext.Current.Request'爲null。事實證明'ServerVariables'是一個靜態(又名全局)變量。 – Andomar

+4

-1:在Q(IIS> = 7&集成模式)的情況下,這將以相同的方式失敗。 – Richard

4

我猜你是在IIS 7上?因爲HttpContext在IIS 6.0上可用。

您可否考慮稍後填寫該信息?例如第一次打電話給Application_BeginRequest

+0

我在IIS7上,多麼有趣...我目前使用Application_BeginRequest,但我寧願有這個代碼,我需要在正確的事件中運行一次。 – Paddy

+0

@Downvoter:我錯在哪裏?我很肯定你在IIS7的BeginRequest之前不能訪問它 – Luk

+0

已經有了一個取消了......你似乎是正確的答案。 – Paddy

0

您是否有權訪問Request對象?如果是的話,我認爲你可以使用 Request.Url.Authority

它會返回你正在尋找的DNS主機名。

G

14

您的網絡應用程序可以在多個不同的域下運行。由於Application_Start事件中沒有當前的請求,因此無法知道應用程序將在哪個域中調用。

然而,您可以使用System.Environment.MachineName找出機器名稱。

3

在VB.NET,在Global.asax中,我使用以下命令:

Hosting.HostingEnvironment.ApplicationHost.GetSiteName 

它對應於IIS應用程序的名稱。

更新:看來,方法「GetSiteName」不打算直接調用,它不適用於我在Visual Studio 2015中(或者也許是因爲我所做的框架版本更改)。 - HttpContext.Current是一個靜態成員

System.Web.Hosting.HostingEnvironment.SiteName