我有以下方法:
public static string GetHttpHost(System.Web.HttpRequest hr)
{
return "http://" + hr.Url.Host + ":" + hr.Url.Port.ToString() ;
}
当我使用GetHttpHost(this.Request)
和GetHttpHost(HttpContext.Current.Request)
调用此方法时,会返回不同的结果。
例如:
GetHttpHost(this.Request)
会返回http://192.168.1.103:80
GetHttpHost(HttpContext.Current.Request)
会返回http://app133:80
(app133是我们的网络服务器的名称)我在Stack Overflow中搜索过,所有相关问题都告诉我HttpContext.Current.Request和Page.Request是同一个对象。
那么,有人能告诉我代码中发生了什么吗?
感谢。
答案 0 :(得分:0)
不,HttpContext.Current.Request
和Page.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和其他机器名称,但上面可以解释其中的区别。