大家好,我在使用Visual Studio 2008(Cassini)在内置Web服务器上本地测试ASP.NET应用程序时似乎发现了差异。
我在本地计算机上设置了一个主机,将 dev.testhost.com 与 127.0.0.1 相关联,因为我的应用程序需要更改其外观取决于用于调用它的主机头。
但是,当我使用http://dev.testhost.com:1234/index.aspx
请求我的测试应用时,Request.Url.Host
的值始终为"localhost"
。而Request.Headers["host"]
的值是"dev.testhost.com:1234"
(正如我所期望的那样都是)。
我并不担心第二个值包含端口号,但我很担心为什么 HOST NAMES完全不同!有谁知道这是一个已知的问题,还是设计?还是我是个白痴?!
我宁愿使用 - 由于可能造成混淆而删除! - 山姆 Request.Url.Host
,因为这样可以避免在测试时删除端口号...
答案 0 :(得分:9)
Request.Headers["host"]
是从连接到服务器的应用程序接收的值,而另一个值是服务器在尝试获取域名时获得的值。
浏览器在请求中使用输入的域名,因为它用于虚拟域。服务器报告服务器首选项中设置的一个,或者它找到的第一个。
编辑:查看Cassini的代码以查看它是否使用某些特定设置,我注意到以下代码:
public string RootUrl {
get {
if (_port != 80) {
return "http://localhost:" + _port + _virtualPath;
}
else {
return "http://localhost" + _virtualPath;
}
}
}
//
// Socket listening
//
public void Start() {
try {
_socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, _port);
}
catch {
_socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, _port);
}
// …
}
解释似乎是Cassini明确引用localhost,并且不尝试进行反向DNS查找。不同的是,它不会使用return "http://localhost" + _virtualPath;
。
答案 1 :(得分:8)
Request.Headers["host"]
是浏览器的http标头中指定的主机。 (例如,如果您使用Fiddler或HttpWatch检查流量,这就是您所看到的)
但是,ASP.NET将此(以及其他请求信息)放入System.Uri
实例,该实例将请求字符串解析为其组成部分。在这种情况下,“主机”实际上是指原始请求的主机部分(例如,tcp端口在端口中)属性。
这个System.Uri
类是一个非常有用的帮助类,可以解决将请求拆分为部分的麻烦,而来自http头的“Host:”(以及“GET”)只是原始请求数据。
虽然它们都有相同的名称,但它们并不一定是同一个东西。
答案 2 :(得分:1)
这是w3 specs所说的与Microsoft Uri.Host属性应包含的内容的关系。命名并不意味着MS尝试提供相同的功能。包含端口号的功能是Uri.Authority。
随着您发布的更新,您仍然面临同样的问题,只是检查它的不同方面。 Uri.Host property没有明确或暗示执行与w3规范中定义的标题相同的功能。在长格式中,以下是来自Uri.Host MSDN页面的一些引用:
Uri.Host Property
获取此实例的主机组件。物业价值
输入:System.String
包含主机名的String。这通常是服务器的DNS主机名或IP地址。
无法保证这与标题中的内容相匹配,只是它代表某种形式的主机名。