C# 确定域名是否在“a”中有效的最佳方法;主持人;文件

C# 确定域名是否在“a”中有效的最佳方法;主持人;文件,c#,validation,domain-name,hosts-file,C#,Validation,Domain Name,Hosts File,Windows允许您将IP与比普通Internet域名自由度大得多的相关联。我想创建一个函数,用于确定给定名称是否为有效的“主机”文件域名 基于对有效和无效功能的分析和实验,我提出了以下功能: private static bool IsValidDomainName(string domain) { if (String.IsNullOrEmpty(domain) || domain.Length > 255) { return false; }

Windows允许您将IP与比普通Internet域名自由度大得多的相关联。我想创建一个函数,用于确定给定名称是否为有效的“主机”文件域名

基于对有效和无效功能的分析和实验,我提出了以下功能:

private static bool IsValidDomainName(string domain)
{
    if (String.IsNullOrEmpty(domain) || domain.Length > 255)
    {
        return false;
    }

    Uri uri;

    if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri))
    {
        return false;
    }

    if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString())
    {
        return false;
    }

    foreach (string part in uri.Host.Split('.'))
    {
        if (part.Length > 63)
        {
            return false;
        }
    }

    return true;
}
它还有一个好处,就是可以使用Unicode名称(基本正则表达式可能会失败)

有没有更好/更优雅的方法

更新:正如所建议的,该方法几乎满足了我的要求,但它不允许Windows在“hosts”文件中允许使用“-test”等主机名。我会把“-”部分作为特例,但我担心会有更多的特例

方法如何


为什么要自己做呢?

这些方法不可靠,因为即使域名是假的,比如“fasdfasd.com”,你也会得到一些响应

最好的方法是发送WebResponse并等待来自域的响应。下面是这个过程的完整代码和解释(代码段很长,所以不要在这里复制粘贴)


谢谢

请注意,即使传递null或空字符串也会返回正确答案。我以前从未见过这种方法。我在电话里没听到。它比我的“http”前缀hack好,但主机文件允许使用“-test”作为名称,但此函数表示它无效。“http”前缀hack正确地允许“-test”的情况,但仅使用Uri.CheckHostName是不允许的。我不知道主机文件中允许的所有内容,例如“-test”@Dwza虽然
afdasdfa
不是一个,但它仍然是一个有效的名称,例如主机名。我不同意,这不是最好的方法。这是最可靠的方法(因为现在您毫无疑问地知道域是有效的)。然而。。如果域未在任何地方注册或托管,或者您无法通过网络访问,或者由于某种原因而关闭,该怎么办?在这些情况下,这将在有效域上失败,至少可能会失败更多。您应该查询whois,以确保该域已注册
private static bool IsValidDomainName(string name)
{
    return Uri.CheckHostName(name) != UriHostNameType.Unknown;
}