【问题标题】:Request.ServerVariables["HTTP_HOST"] is null or emptyRequest.ServerVariables["HTTP_HOST"] 为空或为空
【发布时间】:2014-05-23 00:54:00
【问题描述】:

这是一个基于 IIS 7.5 的 ASP.NET 2.0 网站。下面是我的 global.asax。它有 BeginRequest 和一个静态方法。 有人看到 Request.ServerVariables["HTTP_HOST"] 为空或为空有什么问题吗?

Global.asax:

<%@ Application Language="C#" %>
<script runat="server">
void Application_BeginRequest(object sender, EventArgs e)
{
   string host = GetHost(HttpContext.Current); //this is returning null;
}
public static string GetHost(HttpContext context)
{
        if (context == null) return null;
        string httpHost = context.Request.ServerVariables["HTTP_HOST"];
        if (string.IsNullOrEmpty(httpHost)) return null;
        string hostName = httpHost.Split(new char[] { ':' })[0];
        return hostName;
}
</script>

这在 IIS 6 的本地机器和测试服务器上运行良好,但在 IIS 7.5 的生产服务器上运行良好。

添加调试信息,发现返回 null 的是 string.IsNullOrEmpty(httpHost) 语句。 当我查看 Firebug 时,我看到请求标头显示主机已按预期设置。

有什么想法吗?

注意:我将直接在 BeginRequest 中移动 GetHost 中的代码,但现在只是寻找对当前行为的一些解释

更新:我尝试通过页面上的 Page_Load 访问它,我得到了正确的值。所以它可能与 Global.asax 或不确定还有什么有关。

【问题讨论】:

  • 不是 HttpContext.Current,base.Context 返回什么不同的东西吗?
  • @Josh 我可能会在星期一尝试,但我想知道为什么这对 HTTP_HOST 很重要?
  • 在这里您可以找到有关您的问题的更多信息:Request.ServerVariables
  • @Cerveser 我在 Begin_Request 中使用它,它在 Request 对象上没有出错,但它是 Host ServerVariable 为空。
  • 您是否在 .NET 2.0 经典模式下的 IIS7 中运行它?也许您应该在应用程序池中将启用 32 位应用程序设置为 true。

标签: asp.net iis http-host server-variables


【解决方案1】:

要获取主机名称,请改用:

HttpContext.Current.Request.Url.Host

【讨论】:

    【解决方案2】:

    我建议您尝试 Application_AcquireRequestState 而不是 Application_BeginRequest。

    所有会话“功能”都在该事件中可用,并且也针对每个请求运行。

    <%@ Application Language="C#" %>
    <script runat="server">
    void Application_AcquireRequestState(object sender, EventArgs e)
    {
       string host = GetHost(HttpContext.Current);
    }
    public static string GetHost(HttpContext context)
    {
            if (context == null) return null;
            string httpHost = context.Request.ServerVariables["HTTP_HOST"];
            if (string.IsNullOrEmpty(httpHost)) return null;
            string hostName = httpHost.Split(new char[] { ':' })[0];
            return hostName;
    }
    </script>
    

    【讨论】:

    • 我会尝试,但我想知道的是为什么它可以在本地机器和测试服务器(IIS 6)上运行,但不能在生产环境(IIS 7.5)上运行。
    • IIS6 和 IIS7 的工作方式并不完全相同。到目前为止,我可以告诉你关于 global.asax 使用的行为应该是相同的,但有时不是。也许如果您在 IIS 7.5 中以集成模式运行应用程序,而在 IIS 6 中以经典模式运行应用程序,这将是一个解释。
    • 它在我的本地 IIS 7.5 上也可以正常工作。还有其他一些我无法弄清楚的事情。不过,另一个应用程序中的类似代码运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多