2009-11-24 158 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