确定主机是解析 DNS 名称还是 IP
Posted
技术标签:
【中文标题】确定主机是解析 DNS 名称还是 IP【英文标题】:Determine if Host Is Resolved DNS Name Or IP 【发布时间】:2016-01-08 08:26:53 【问题描述】:如果从HttpContext
的HttpRequest
的Headers
集合中提取HOST
值,有没有办法确定返回的值是DNS 解析名称还是直接IP 地址?
示例用法
string host = HttpContext.Current.Request.Headers["HOST"];
if (host.IsIPAddress()) ... /// Something like this ?
or
(host.IsDNSResolved()) // Or this?
总结
很明显,可以对结果进行正则表达式模式测试以查找 IP 模式,但HttpContext
或更可能是HttpRequest
上是否有属性,甚至是来自助手的外部静态方法哪个类可以代替?
【问题讨论】:
也许一个辅助问题是,.Net 中如何获得 DNS 列表?虽然很大...... Host 标头由客户端 (en.wikipedia.org/wiki/List_of_HTTP_header_fields) 发送。从服务器端,您可以使用 Request.UserHostName 和/或 Request.UserHostAddress 而不是使用客户端标头? 我不明白读取 HOST 值的目的,因为它将与您的服务器的部署位置相同,除非它位于与处理请求的服务器不同的服务器上的负载均衡器后面。您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST 标头读取的值进行比较 @Gururaj 代码最初是在某些东西背后,我不记得那是一年半前,但是是的,它需要了解有关已解析名称 vs正确路由的 IP。 @OmegaMan - 您可以使用 Dns.GetHostName() 来获取 HostName 并将其与标头中的 Host 值进行比较。我希望它能解决您的问题 【参考方案1】:Uri.CheckHostName()
怎么样?
这会返回一个System.UriHostNameType
。
例子:
Uri.CheckHostName("127.0.0.1"); //=> IPv4
Uri.CheckHostName("www.google.com"); //=> Dns
Uri.CheckHostName("localhost"); //=> Dns
Uri.CheckHostName("2000:2000:2000:2000::"); //=> IPv6
当然,要使用您建议的方式,最简单的方法是创建一个扩展,如下所示:
public static class UriExtension
public static bool IsIPAddress(this string input)
var hostNameType = Uri.CheckHostName(input);
return hostNameType == UriHostNameType.IPv4 || hostNameType == UriHostNameType.IPv6;
结果如下:
"127.0.0.1".IsIPAddress(); //true
"2000:2000:2000:2000::".IsIPAddress(); //true
"www.google.com".IsIPAddress(); //false
【讨论】:
仅供大家参考 - Uri.CheckHostName("10"); //=> IPv4。所以,它不可靠。【参考方案2】:您可以利用System.Net.IPAddress.TryParse Method (String, IPAddress)
并创建一个扩展方法来执行所需的功能。
public static class IpAddressExtension
public static bool IsIPAddress(this string ipAddress)
System.Net.IPAddress address = null;
return System.Net.IPAddress.TryParse(ipAddress, out address);
现在允许以下操作
string host = System.Web.HttpContext.Current.Request.Headers["HOST"];
if (host.IsIPAddress())
//...valid ip address
【讨论】:
【参考方案3】:您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST 标头读取的值进行比较 - 类似这样
var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();
if(host.ToLower().Equals(machineHostName.ToLower()))
// Perform your action here.
【讨论】:
以上是关于确定主机是解析 DNS 名称还是 IP的主要内容,如果未能解决你的问题,请参考以下文章
虚拟机安装的ubuntu 12.04 版本只能ping ip地址,ping不了域名。宿主机是win7,校园网+寝室路由器。