确定主机是解析的DNS名称还是IP

本文关键字:IP DNS 主机 | 更新日期: 2023-09-27 18:17:07

如果从HttpContextHttpRequestHeaders集合中提取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,甚至一个外部静态方法的助手类可以做这个决定,而不是?

确定主机是解析的DNS名称还是IP

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.
}