确定主机是否已解析DNS名称或IP

Ωme*_*Man 12 .net c# ip dns httprequest

如果一个人提取HOST从值HttpContextHttpRequestHeaders 集合,有没有确定是否返回的值是DNS解析的名称或直接IP地址的方式吗?

示例用法

 string host = HttpContext.Current.Request.Headers["HOST"]; 

 if (host.IsIPAddress()) ... /// Something like this ?
     or
    (host.IsDNSResolved()) // Or this?
Run Code Online (Sandbox Code Playgroud)

摘要

很明显,人们可以对结果进行正则表达式模式测试以寻找IP模式,但是是否有一个属性HttpContext或者更可能HttpRequest,或者甚至是辅助类的外部静态方法可以做出这样的决定?

Nko*_*osi 7

您可以利用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在允许以下内容

string host = System.Web.HttpContext.Current.Request.Headers["HOST"];

if (host.IsIPAddress()) {
    //...valid ip address
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*cia 6

怎么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
Run Code Online (Sandbox Code Playgroud)

当然,使用建议的方法,最简单的方法是创建扩展,如下所示:

    public static class UriExtension {
        public static bool IsIPAddress(this string input) {
            var hostNameType = Uri.CheckHostName(input);

            return hostNameType == UriHostNameType.IPv4 || hostNameType == UriHostNameType.IPv6;
        }
    }
Run Code Online (Sandbox Code Playgroud)

结果如下:

"127.0.0.1".IsIPAddress(); //true
"2000:2000:2000:2000::".IsIPAddress(); //true
"www.google.com".IsIPAddress(); //false
Run Code Online (Sandbox Code Playgroud)