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


如果一个人正在提取一个 HOST 来自的价值 HttpContextHttpRequestHeaders  集合,有没有办法确定返回的值是DNS解析名称还是直接IP地址?

示例用法

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

 if (host.IsIPAddress()) ... /// Something like this ?
     or
    (host.IsDNSResolved()) // Or this?

概要

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


2288
2017-10-10 13:08


起源

也许一个辅助问题可能是,.Net如何获得DNS列表?虽然很大...... - ΩmegaMan
主机头由客户端发送(en.wikipedia.org/wiki/List_of_HTTP_header_fields)。从服务器端,您可以使用Request.UserHostName和/或Request.UserHostAddress而不是使用客户端头? - Simon Mourier
我不理解读取HOST值的目的,因为它与部署服务器的位置相同,除非它作为处理请求的服务器位于不同服务器上的Load Balancer后面。你可以做的一种方法是使用Dns.GetHostName()来获取执行此语句的机器的HostName,以便与从HOST头读取的值进行比较 - Gururaj
@Gururaj代码原本落后于某些东西, 我记不清那是一年半以前了,但是,它需要了解一个已解决的名称与IP以正确路由。 - ΩmegaMan
@OmegaMan - 您可以使用Dns.GetHostName()获取HostName并将其与标头中的Host值进行比较。我希望它能解决你的问题 - Gururaj


答案:


怎么样 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

4
2018-05-12 10:03





你可以利用 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
}

7
2018-05-09 09:53





你可以做的一种方法是使用Dns.GetHostName()来获取执行此语句的机器的HostName,以便与你从HOST头读取的值进行比较 - 类似这样的

var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();

if(host.ToLower().Equals(machineHostName.ToLower()))
{
    // Perform your action here.
}

0
2018-05-08 13:20