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

Sam*_*ury 16 c# asp.net debugging cassini visual-studio

大家好,我似乎发现在使用Visual Studio 2008(Cassini)在内置Web服务器上本地测试ASP.NET应用程序时存在差异.

我在本地机器上设置了一个主机,将dev.testhost.com127.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,因为这样可以避免在测试时删除端口号... - 由于可能导致混淆而删除! - 山姆

kia*_*uno 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);
  }
  // …
}
Run Code Online (Sandbox Code Playgroud)

解释似乎是Cassini明确引用localhost,并且不尝试进行反向DNS查找.不同的是,它不会使用return "http://localhost" + _virtualPath;.


Rob*_*ine 8

Request.Headers["host"]是浏览器的http标头中指定的主机.(例如,如果您使用Fiddler或HttpWatch检查流量,这就是您所看到的)

但是,ASP.NET将此(以及其他请求信息)放入一个System.Uri实例中,该实例将请求字符串解析为其组成部分.在这种情况下,"主机"实际上是指原始请求的主机部分(例如,tcp端口在端口中)属性.

这个System.Uri类是一个非常有用的帮助器类,可以解决将请求拆分为部分的麻烦,而http头中的"Host:"(以及"GET")只是原始请求数据.

虽然它们都有相同的名称,但它们并不一定是同一个东西.