13

Windows Hosts 文件允许您将 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 名称一起使用(基本的正则表达式会失败)。

有没有更好/更优雅的方法来做到这一点?

更新:正如Bill所建议的那样,Uri.CheckHostName方法几乎可以满足我的要求,但它不允许 Windows 允许在“主机”文件中使用诸如“-test”之类的主机名。我会对“-”部分进行特殊处理,但我担心还有更多特殊情况。

4

2 回答 2

39

System.Uri.CheckHostName()方法怎么样?

private static bool IsValidDomainName(string name)
{
    return Uri.CheckHostName(name) != UriHostNameType.Unknown;
}

为什么要自己做作业?

于 2009-06-09T00:05:41.667 回答
0

这些方法并不可靠,因为即使域名是假的,例如“fasdfasdfasd.com”,您也会得到一些响应。

最好的方法是发送 WebResponse 并等待来自域的响应。这是此过程的完整代码和说明(代码片段很长,因此此处不复制粘贴)。

http://www.dotnetfunda.com/articles/show/1072/validating-domain-name-in-aspnet

谢谢

于 2014-11-26T12:57:52.937 回答