为什么请求[“主机”] ==“dev.testhost.com:1234”而Request.Url.Host ==“本地主机”

问题描述:

大家好,我似乎发现测试ASP.NET应用程序时的差异使用Visual Studio 2008(Cassini)在内置Web服务器上进行本地化。为什么请求[“主机”] ==“dev.testhost.com:1234”而Request.Url.Host ==“本地主机”

我已经设置了主机上我的本地机器关联dev.testhost.com127.0.0.1,因为我有一个需要依赖于用于调用主机头改变其外观的应用它。

但是,当我使用http://dev.testhost.com:1234/index.aspx请求我的测试应用程序时,Request.Url.Host的值始终为"localhost"。而Request.Headers["host"]的值是"dev.testhost.com:1234"(正如我所预料的那样均为)。

我不关心的是,第二个值包含端口号,但我强大的困惑,为什么主机名是完全不同的!有谁知道这是一个已知的问题,还是通过设计?还是我是个白痴?

我宁愿使用 Request.Url.Host,因为这避免了测试时剥离出来的端口号... - 删除,原因可能造成混乱! - 山姆

+0

从它的MSDN文档看来,Request.Url应该关注发送到服务器的请求。引用http://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx ... > ** HttpRequest Class ** >使ASP.NET能够读取由一个Web请求期间的客户端。 这是什么似乎是在卡西尼运行时所做的... 感谢迄今为止的答案,但我真的不相信有任何好的理由,以相同的请求报告不同的主机名对象... – 2009-12-21 23:42:01

Request.Headers["host"]是从连接到服务器的应用程序收到的值,而另一个值是服务器尝试获取域名时获得的值。

浏览器在请求中使用输入的域名,因为在虚拟域的情况下使用该名称。服务器报告服务器首选项中的一个集合,或者它找到的第一个集合。

编辑:望着卡西尼的代码,看看它是否使用了一些特殊的设置,我发现下面的代码:

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); 
    } 
    // … 
} 

的解释似乎是,卡西尼明确提到为localhost,并且不会尝试进行反向DNS查找。不同的是,它不会使用return "http://localhost" + _virtualPath;

+0

那么,服务器的IP地址是127.0.0.1。这有2个主机映射在c:\ windows \ system32 \ drivers \ etc \ hosts:** localhost **和** dev.testhost.com **但是,当我输入'dev.testhost.com'时'HttpContect.Current.Request.Url.Host'是'localhost'?在生产服务器上,它将是我输入的内容。为什么本地测试服务器(Cassini)与实时服务器不同? – 2009-12-21 21:45:21

+0

定义主机的顺序是什么?可能顺序会影响服务器报告的顺序。 – kiamlaluno 2009-12-21 22:16:04

+0

我只是尝试改变主机的顺序,这没有什么区别!好主意虽然;)我认为这将是令人惊讶的,如果这个工作,因为如果它要一直工作,这可能需要反向DNS查找,我怀疑他们会在一个简单的声音属性...我怀疑那里是卡西尼导致这种差异的错误! – 2009-12-21 22:29:18

这是什么w3 specs说什么与微软Uri.Host属性应该包含什么。命名并不意味着MS试图提供相同的功能。确实包含端口号的功能是Uri.Authority

随着您发布的更新,您仍然面临同样的问题,只是检查它的不同方面。 Uri.Host property没有明示或隐含的陈述来执行与w3规范中定义的头相同的功能。在漫长的形式,这里距离Uri.Host MSDN页一些报价:

Uri.Host物业
获取此实例的主机部分。

属性值

类型:System

包含主机名的字符串。这通常是服务器的DNS主机名或IP地址。

不能保证这将匹配头中的内容,只是它表示某种形式的主机名。

+0

感谢您的尝试,但您错误地阅读了这个问题,现在我已经强调了所说的位**我并不担心第二个值包含端口号** – 2009-12-21 21:48:38

+0

我的答案仍然适用 - 我已经扩展它以使更新的相关性更加明显,但是您的基本问题是假设“System.Uri”对象应该直接与您使用“请求”检索的http标头匹配.Headers'。 – jball 2009-12-21 23:12:08

+0

System.Uri类的对象通常表示URI,我的问题是关于'System.Uri'类的Request.Url **实例**,从正在呈现的aspx页面访问由于对特定URL的请求。 Request.Uri属性与Request的Url不匹配有什么意义? 为了澄清,你可以调用'Request.Url.ToString()',它仍然报告'http:// localhost:1234/Default.aspx',而请求是为'http://dev.testhost.com: 1234/Default.aspx' ... – 2009-12-21 23:28:47

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

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

这个System.Uri类是一个非常有用的帮助类,它把你的请求分解成它的所有部分,而http头中的“Host:”(对于这个“GET”)只是原始的请求数据。

尽管它们都有相同的名称,但它们并不意味着是同一件事。

+0

感谢您的回答,我想知道的是如何'分裂'http://dev.testhost.com:1234/可能会导致完全失去'dev.testhost.com'部分,并将其替换为'localhost' 的?我的问题并不是关于Uri或UriBuilder类,我理解这些类;)而且,**端口号根本就不是问题**。我在我的问题的第三段中加入了**重点**,也许这会使它更清晰?再次感谢;) – 2009-12-21 21:38:11

+0

那么 - 你说你已经将dev.testhost.com与IP地址127.0.0.1关联。 但是,该IP地址始终映射到本地主机(根据定义 - 它是回送地址) - 因此,127.0.0.1上的任何名称查找都将映射到本地主机。 当你说“将dev.testhost.com与127.0.0.1关联起来”时,你是如何做到这一点的?你是编辑hosts文件,还是以其他方式做? – 2009-12-22 00:29:38

+0

我在主机文件中添加了条目。请参阅下面的kiamlaluno的答案...看起来这是一个卡西尼特定的问题... – 2009-12-22 12:19:16