从String验证Uri

时间:2010-09-09 06:29:27

标签: .net validation uri

我需要一个Uri验证方法。所以,字符串如:

http://www.google.com”, “www.google.com”, “google.com”

..必须验证为Uri。而且像“google”这样的普通字符串也不能被验证为Uri。 要进行此检查,我使用两种方法:UriBuilder和Uri.TryCreate()。

UriBuilder的问题在于我给它的任何字符串,它返回一个Uri。当我在其构造函数中传递一个普通字符串时,它给它一个方案并返回“http://google/”,这不是我想要的行为。

Uri.TryCreate()的问题在于,虽然它可以与“http://www.google.com”和“www.google.com”一起使用,但当我给它“google.com”时,它不会验证为乌里。

我考虑过对字符串进行检查,如果它以http://或www开头,将字符串发送到UriBuilder类,但这对“google.com”也没有帮助,“google.com”也必须是Uri。< / p>

如何将“google.com”等内容验证为Uri,而不是“google”?检查.com,.net,.org字符串的结尾似乎不灵活。

4 个答案:

答案 0 :(得分:17)

您正在寻找的是Uri.IsWellFormedUriString。以下代码返回true:

Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute)

如果将UriKind设置为Absolute,则返回false:

Uri.IsWellFormedUriString("google.com", UriKind.Absolute)

编辑: 有关UriKind枚举的信息,请参阅here

  • RelativeOrAbsolute:Uri的种类是不确定的。
  • 绝对:Uri是绝对的Uri。
  • 亲戚:Uri是亲戚Uri。

来自MSDN documentation

  

绝对URI的特点是对资源的完整引用(例如:http://www.contoso.com/index.html),而相对Uri依赖于先前定义的基URI(例如:/index.html)。

另请参阅Uri.IsWellFormedUriString Uri.IsWellFormedUriString。此方法符合RFC 2396和RFC 2732。

如果查看here,您会发现google.com不是有效的URI。事实上,www.google.com并非如此。但在 F下。缩写网址,此详细说明如下:

  

URL语法旨在明确引用网络      通过URL方案的资源和可扩展性。但是,作为URL      识别和使用已成为司空见惯的传统媒体      (电视,广播,报纸,广告牌等)越来越多      使用缩写的URL引用。即,由...组成的参考      只有所识别资源的权限和路径部分,例如      如        www.w3.org/Addressing/      或者只是DNS主机名。这些参考文献主要是      用于人类解释而非机器,用于      假设基于上下文的启发式方法足以完成      URL(例如,以“www”开头的大多数主机名可能具有      URL前缀“http://”)。虽然没有标准的一套      用于消除缩写URL引用歧义的启发式方法,许多客户端      实现允许用户输入它们      启发式地解决了。应该注意的是,这种启发式可能      随着时间的推移而变化,特别是在引入新的URL方案时。      由于缩写的URL与相对URL路径具有相同的语法,      缩写的URL引用不能用于相对的上下文中      URL是预期的。这限制了缩写URL到场所的使用      没有定义基本URL的地方,例如对话框和离线      广告。

我从中理解的是,{{1}}接受www.abc.com形式的字符串作为有效的URI。但是google.com不被接受为绝对URI,而是被接受为相对URI,因为它符合相对路径规范(路径可以包含。)。

另外,作为旁注,如果要使用正则表达式来解析URI,可以阅读 B.使用正则表达式解析URI引用

答案 1 :(得分:5)

public static bool IsValidUri(string uriString)
{
    Uri uri;
    if (!uriString.Contains("://")) uriString = "http://" + uriString;
    if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri))
    {
        if (Dns.GetHostAddresses(uri.DnsSafeHost).Length > 0)
        {
            return true;
        }
    }
    return false;
}

答案 2 :(得分:3)

这是来自Jojaba的代码的变体,我感谢DNS检查器,这就是我需要的。唯一的问题是它在我的逻辑中使用try catch,我希望避免。

        public static Uri StringToAbsoluteUri(string uriString) 
        {
        Uri resultUri = null;

        if (!uriString.Contains(Uri.SchemeDelimiter))
            uriString = Uri.UriSchemeHttp + Uri.SchemeDelimiter + uriString;

        if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out resultUri))
        {
            try
            {
                IPAddress[] addressesOfHost = Dns.GetHostAddresses(resultUri.DnsSafeHost);
                if (addressesOfHost.Length > 0)
                {
                    return resultUri;
                }
            }
            catch (System.Net.Sockets.SocketException)
            {
                return null;
            }
        }   
        return resultUri;
        }

答案 3 :(得分:2)

使用RegExp。

验证网址的示例代码

Regex RgxUrl = new Regex("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?");
    if (RgxUrl.IsMatch(<yourURLparameter>))
    {
      //url is valid
    }
    else
    {
      //url is not valid
    }