Url.Host在HttpContext.Current.Request和Page.Request中

时间:2012-01-30 09:16:42

标签: c# asp.net

我有以下方法:

    public static string GetHttpHost(System.Web.HttpRequest hr)
    {
        return "http://" + hr.Url.Host + ":" + hr.Url.Port.ToString() ;
    }

当我使用GetHttpHost(this.Request)GetHttpHost(HttpContext.Current.Request)调用此方法时,会返回不同的结果。

例如:

  • 我的请求页面为http://192.168.1.103/mypage.aspx
  • 在mypage.aspx.cs中,调用GetHttpHost(this.Request)会返回http://192.168.1.103:80
  • 渲染mypage.aspx时,涉及一些商业逻辑,因此加载了BLL.dll。在BLL.dll中,调用GetHttpHost(HttpContext.Current.Request)会返回http://app133:80(app133是我们的网络服务器的名称)

我在Stack Overflow中搜索过,所有相关问题都告诉我HttpContext.Current.Request和Page.Request是同一个对象。

那么,有人能告诉我代码中发生了什么吗?

感谢。

1 个答案:

答案 0 :(得分:0)

不,HttpContext.Current.RequestPage.Request不一样。两者都是同一个类的实例(HttpRequest),但这些是不同的实例。

在每种情况下,私有HttpRequest实例的创建方式都不同 - 我无法找到创建它的确切代码,但请记住HttpContext.Current只在任何Page之前创建一次。

这一切归结为HttpRequest类中的以下代码:

public Uri Url
{
    get
    {
        if (this._url == null && this._wr != null)
        {
            string text = this.QueryStringText;
            if (!string.IsNullOrEmpty(text))
            {
                text = "?" + HttpUtility.CollapsePercentUFromStringInternal(text, this.QueryStringEncoding);
            }
            if (AppSettings.UseHostHeaderForRequestUrl)
            {
                string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
                try
                {
                    if (!string.IsNullOrEmpty(knownRequestHeader))
                    {
                        this._url = new Uri(string.Concat(new string[]
                        {
                            this._wr.GetProtocol(), 
                            "://", 
                            knownRequestHeader, 
                            this.Path, 
                            text
                        }));
                    }
                }
                catch (UriFormatException)
                {
                }
            }
            if (this._url == null)
            {
                string text2 = this._wr.GetServerName();
                if (text2.IndexOf(':') >= 0 && text2[0] != '[')
                {
                    text2 = "[" + text2 + "]";
                }
                this._url = new Uri(string.Concat(new string[]
                {
                    this._wr.GetProtocol(), 
                    "://", 
                    text2, 
                    ":", 
                    this._wr.GetLocalPortAsString(), 
                    this.Path, 
                    text
                }));
            }
        }
        return this._url;
    }
}

正如您所看到的,它首先尝试读取GetKnownRequestHeader基类中的已知请求标头(System.Web.HttpWorkerRequest方法),并且只有在它失败时才会调用GetServerName方法,该方法将返回IP地址或服务器名称取决于托管Web应用程序的位置。

没有找到任何官方文件或证据,说明为什么只返回IP和其他机器名称,但上面可以解释其中的区别。