2015-10-10 98 views
11

如果正在从HttpContext的集合中提取HOST的值,是否有方法确定返回的值是DNS解析名称还是直接IP地址?确定是否解析主机DNS名称或IP

使用示例

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

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

摘要

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

+0

也许一个辅助问题可能是,如何在.Net中可以得到一个DNS列表?尽管巨大... – OmegaMan

+2

主机头由客户端发送(https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)。从服务器端,您可以使用Request.UserHostName和/或Request.UserHostAddress而不是使用客户端标头? –

+0

我不理解读取HOST值的目的,因为它与您的服务器部署位置相同,除非它位于与处理请求的服务器不同的服务器上的Load Balancer后面。 你可以做的一种方法是使用Dns.GetHostName()来获取执行此语句的机器的HostName,以便与您从HOST头读取的值进行比较 – Gururaj

回答

4

如何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 
0

一种方法是使用Dns.GetHostName()来获得,其中这一说法得到执行来比较你从HOST头读取的值机的主机名 - 这样的事情

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

if(host.ToLower().Equals(machineHostName.ToLower())) 
{ 
    // Perform your action here. 
} 
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); 
    } 
} 

这现在允许以下

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

if (host.IsIPAddress()) { 
    //...valid ip address 
}