如何检查网址是否有效

时间:2012-09-12 10:57:23

标签: c# asp.net .net uri

我正在尝试使用.NET过滤掉有效网址中的无效网址。

我正在使用Uri.TryCreate()方法。

它具有以下语法

public static bool TryCreate(Uri baseUri,string relativeUri,out Uri result)

现在我正在做这个......

Uri uri = null;

var domainList = new List<string>();
domainList.Add("asas");
domainList.Add("www.stackoverflow.com");
domainList.Add("www.codera.org");
domainList.Add("www.joker.testtest");
domainList.Add("about.me");
domainList.Add("www.ma.tt");

var correctList = new List<string>();

foreach (var item in domainList)
{
    if(Uri.TryCreate(item, UriKind.RelativeOrAbsolute, out uri))
    {    
        correctList.Add(item);
    }
}

我正在尝试上面的代码,我希望它从列表中删除asaswww.joker.testtest,但它不会。

有人可以帮我解决这个问题。

更新: 刚试过Uri.IsWellFormedUriString这也没有帮助。

更新

有效的uri列表

无效的uri列表

  • ASAS
  • 如#@ SAD
  • this.not.valid
  • www.asa.toptoptop

6 个答案:

答案 0 :(得分:2)

您似乎对确切的URL(或URI,这里的差异不重要)感到困惑。例如,http://stackoverflow.com是有效的绝对URL。另一方面,stackoverflow.com在技术上是一个有效的相对URL,但它会引用当前目录中名为stackoverflow.com的文件,而不是具有该名称的网站。但stackoverflow.com是已注册的域名

如果您想检查域名是否有效,您需要定义“有效”的具体含义:

  1. 这是一个有效的域名吗?检查字符串是否由用点分隔的部分组成,每个部分可以包含字母,数字和连字符(-)。例如,asasthis.not.valid都是有效的域名。
  2. 可能是互联网域名吗? Internet上的域名(与Intranet相对)是特定的,因为它们始终具有TLD(顶级域)。因此,asas肯定不是互联网域名,但this.not.valid可能是。
  3. 它是现有顶级域名下的域名吗?您可以下载the list of all TLDs并进行检查。例如,this.not.valid在此规则下不会被视为有效,但thisisnotvalid.com会。
  4. 是注册域名吗?
  5. 域名是否解析为IP地址?可以注册域名,但其DNS记录中可能没有IP地址。
  6. 域名指向的计算机是否响应请求?最有意义的请求是简单的HTTP请求(例如,尝试访问http://domaininquestion/)或ping。

答案 1 :(得分:1)

试试这个:

public static bool IsWellFormedUriString(     string uriString,     UriKind uriKind )

或者Alternativly你可以使用RegExp这样做:

^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$

参加此list

答案 2 :(得分:1)

问题是您在此处添加的网址都不会归类为绝对网址。为此,你必须在URL的协议前加上它。

您可以测试并找出

www.stackoverflow.com - 相对网址
http://www.stackoverflow.com - 绝对网址
//www.stackoverflow.com - 绝对网址(这里不足为奇。Refer RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Section 4.2

重点是你必须至少加//前缀才能显示它是一个绝对网址。

因此,简而言之,由于您的所有网址都是相对网址,因此会通过您的所有测试。

答案 3 :(得分:0)

您的所有示例都有效,
有些是绝对的URL,有些是相对的,这就是为什么没有一个被删除。

对于每个Uri,您可以尝试构建一个HttpWebRequest类 然后检查是否有正确的答案。

答案 4 :(得分:0)

在检查其他人的答案后,我知道你不是在寻找域的存在并且ping回来你需要根据你的GRAMMER ...或者域名语法对它们进行测试吗?

为此,您只需要依赖正则表达式测试...并制定适当的规则来制定域名,如果失败则将其从列表中排除。

您可以adopt这些模式并修改一个以满足您的需求,然后使用列表中的每个元素对其进行测试。

答案 5 :(得分:-1)

您的所有URI都格式正确URI,因此TryCreateIsWellFormedUriString将不适用于您的情况。

来自here

,解决方案正在尝试打开URI:

using(var client = new MyClient()) {
    client.HeadOnly = true;
    // fine, no content downloaded
    string s1 = client.DownloadString("www.stackoverflow.com");
    // throws 404
    string s2 = client.DownloadString("www.joker.testtest");
}