【问题标题】:Determine if Host Is Resolved DNS Name Or IP确定主机是解析 DNS 名称还是 IP
【发布时间】:2016-01-08 08:26:53
【问题描述】:

如果从HttpContextHttpRequestHeaders 集合中提取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 值进行比较。我希望它能解决您的问题

标签: c# .net dns ip httprequest


【解决方案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.
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      相关资源
      最近更新 更多