确定主机是否已解析 DNS 名称或 IP
Determine if Host Is Resolved DNS Name Or IP
如果从 HttpContext
的 HttpRequest
的 Headers
集合中提取 HOST
值,是否有一种方法可以确定返回的值是否是DNS 解析名称或直接 IP 地址?
示例用法
string host = HttpContext.Current.Request.Headers["HOST"];
if (host.IsIPAddress()) ... /// Something like this ?
or
(host.IsDNSResolved()) // Or this?
总结
很明显,可以对结果进行正则表达式模式测试以查找 IP 模式,但是 HttpContext
或更可能 HttpRequest
上是否有 属性,甚至是辅助程序 class 的外部静态方法,它可以代替该确定?
您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST header 读取的值进行比较 - 类似于这个
var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();
if(host.ToLower().Equals(machineHostName.ToLower()))
{
// Perform your action here.
}
您可以利用 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
}
这个returns一个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
如果从 HttpContext
的 HttpRequest
的 Headers
集合中提取 HOST
值,是否有一种方法可以确定返回的值是否是DNS 解析名称或直接 IP 地址?
示例用法
string host = HttpContext.Current.Request.Headers["HOST"];
if (host.IsIPAddress()) ... /// Something like this ?
or
(host.IsDNSResolved()) // Or this?
总结
很明显,可以对结果进行正则表达式模式测试以查找 IP 模式,但是 HttpContext
或更可能 HttpRequest
上是否有 属性,甚至是辅助程序 class 的外部静态方法,它可以代替该确定?
您可以做的一种方法是使用 Dns.GetHostName() 获取执行此语句的机器的主机名,以与您从 HOST header 读取的值进行比较 - 类似于这个
var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();
if(host.ToLower().Equals(machineHostName.ToLower()))
{
// Perform your action here.
}
您可以利用 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
}
这个returns一个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