确定主机是解析的DNS名称还是IP
本文关键字:IP DNS 主机 | 更新日期: 2023-09-27 18:17:07
如果从HttpContext
的HttpRequest
的Headers
集合中提取HOST
值,是否有一种方法确定返回的值是DNS解析名称还是直接IP地址?
string host = HttpContext.Current.Request.Headers["HOST"];
if (host.IsIPAddress()) ... /// Something like this ?
or
(host.IsDNSResolved()) // Or this?
很明显,一个人可以做一个regex模式测试的结果来寻找一个IP模式,但是否有一个属性在HttpContext
或更可能的HttpRequest
,甚至一个外部静态方法的助手类可以做这个决定,而不是?
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
您可以利用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
}
一种方法是使用Dns.GetHostName()获取执行该语句的机器的主机名,以便与从HOST头中读取的值进行比较—类似于
var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();
if(host.ToLower().Equals(machineHostName.ToLower()))
{
// Perform your action here.
}