2009-08-03 36 views
38

我需要将主机从Request对象中取出。我应该使用哪个属性,为什么?主机与DnsSafeHost

从MSDN:

Uri.DnsSafeHost属性

包含URI的转义 主机部分即以进行DNS解析合适 的字符串;或者原始 未转义的主机字符串,如果它是 已经适合解析。

VS

Uri.Host物业

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

我的测试已经与ASP.NET开发服务器。这两个总是返回localhost。即使我放入127.0.0.1,都会返回localhost

阅读后,DnsSafeHost属性将处理IPv6地址以及Unicode到ASCII转换(如果需要)。它也可以解释IRI和IDN。即使我目前不关心这些事情,我应该只使用DnsSafeHost属性来保证安全吗?

回答

44

DnsSafeHost添加到URL,如果您打算将生成的主机名称发送到您自己的DNS服务器。 DNS最初是仅支持ASCII的协议(and a subset of ASCII at that)。当前URL允许URL的主机部分中的字符序列不能直接发送到DNS服务器。例如:

  • bracket-enclosed IPv6 addresses。 DnsSafeHost删除括号。

  • 非ASCII,非英文域名。 DnsSafeHost(可选)使用RFC 3987 IRI来规范化字符,并将非ASCII字符转换为IDNPunycode编码。

  • 谁知道未来会允许哪些网址?该应用程序可能会超出我们对URL中可以使用的假设。 DnsSafeHost在那里增加了一定程度的恢复能力。

如果你需要显示的主机名的用户,请使用主机属性。

+5

这很有道理。我没有考虑Host如何使用显示名称,并且DnsSafeHost以编程方式使用。感谢您提供清晰简洁的答案! – 2009-08-04 01:28:07