为什么Request [“host”] ==“dev.testhost.com:1234”而Request.Url.Host ==“localhost”

时间:2009-12-21 17:39:38

标签: c# asp.net visual-studio debugging cassini

大家好,我在使用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,因为这样可以避免在测试时删除端口号... - 由于可能造成混淆而删除! - 山姆

3 个答案:

答案 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地址。

无法保证这与标题中的内容相匹配,只是它代表某种形式的主机名。