【问题标题】:Global ASAX - get the server name全局 ASAX - 获取服务器名称
【发布时间】:2010-12-19 21:55:39
【问题描述】:

谁能告诉我是否有办法在 global.asax 的 Application_Start 事件中获取我网站的域名?

通常我只是从 Context.Request.ServerVariables["SERVER_NAME"] 中获取它,但这不可用。理想情况下,我还想从启动应用程序的请求中获取 URL。


嗯 - 从下面的答案来看,似乎在 IIS7 上会有所不同。这是新的,现在有设计指南试图阻止你这样做:

IIS Blog

【问题讨论】:

    标签: asp.net .net asp.net-mvc iis-7


    【解决方案1】:

    您可以通过静态HttpContext.Current 成员访问Context

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

    编辑,根据你的一些 cmets 我做了一些额外的研究

    此错误是由于 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/

    【讨论】:

    • 我认为Application_Start中没有HttpContext
    • @Luk - HttpContext.Current 是一个静态成员。你在什么范围内都没有关系。它就在那里。如果您遇到问题,请完全限定它 System.Web.HttpContext.Current
    • 如果我这样做,我会收到一个运行时错误,指出请求在此上下文中不可用。资格没有区别。
    • @Bob - 请查看我刚刚在问题中发布的链接。
    • 如果 HttpContext.Current.Request 仍然为空怎么办?
    【解决方案2】:

    您的网络应用程序可以在多个不同的域下运行。由于Application_Start 事件中没有当前请求,因此您无法知道应用程序将在哪个域下调用。

    但是,您可以使用 System.Environment.MachineName 找到机器名称。

    【讨论】:

      【解决方案3】:

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

      您可以考虑稍后填写这些信息吗?比如第一次调用Application_BeginRequest

      【讨论】:

      • 我在 IIS7 上,多么有趣...我目前正在使用 Application_BeginRequest,但我更希望这段代码需要在正确的事件中运行一次。
      • @Downvoter:我哪里错了?我很确定您在 IIS7 中的 BeginRequest 之前无法访问它
      • 有一个取消它...你似乎是正确的答案。
      【解决方案4】:

      在 VB.NET 中,在 Global.asax 中,我使用以下内容:

      Hosting.HostingEnvironment.ApplicationHost.GetSiteName
      

      它对应于IIS中的应用程序名称。

      更新: 似乎方法“GetSiteName”不打算直接调用,它在 Visual Studio 2015 中不再适用于我(或者可能是因为框架版本更改了我制成)。我通过替换它来修复它:

      System.Web.Hosting.HostingEnvironment.SiteName
      

      【讨论】:

        【解决方案5】:

        您是否有权访问 Request 对象?如果是这样,我认为你可以使用 Request.Url.Authority

        它将返回您正在寻找的 dns 主机名。

        G

        【讨论】:

          【解决方案6】:

          你试过了吗:-

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

          谢谢,

          菲尔。

          【讨论】:

          • +1 令人惊讶的是,即使在Application_Start 中也可以使用,其中HttpContext.Current.Requestnull。原来ServerVariables 是一个静态(又名全局)变量。
          • -1:在 Q (IIS>=7 & 集成模式) 的情况下,这将以同样的方式失败。
          猜你喜欢
          • 1970-01-01
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-04
          • 2014-03-21
          相关资源
          最近更新 更多