如何检查uri字符串是否有效

时间:2011-01-29 05:04:26

标签: c# .net uri

如何检查uri字符串是否有效(您可以将其提供给Uri构造函数)?

到目前为止,我只有以下内容,但由于显而易见的原因,我更喜欢不那么粗野的方式:

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }

我尝试了Uri.IsWellFormedUriString但它似乎并不喜欢你可以在构造函数中抛出的所有内容。例如:

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));

输出将是:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

更新/应答

Uri构造函数默认使用类Absolute。当我尝试使用Uri.TryCreate和构造函数时,这导致了差异。如果匹配构造函数和TryCreate的UriKind,则会获得预期的结果。

6 个答案:

答案 0 :(得分:68)

格式良好的URI意味着与某些RFC的一致性。示例中的本地路径不符合这些路径。请阅读IsWellFormedUriString文档中的更多内容。

该方法的错误结果并不意味着Uri类将无法解析输入。虽然URI输入可能不符合RFC,但它仍然可以是有效的URI。

更新:并回答您的问题 - 正如Uri文档所示,有一个名为TryCreate的静态方法将完全尝试您想要的并返回true或false(以及实际Uri实例,如果为真)。

答案 1 :(得分:28)

由于接受的答案并未提供明确的示例,因此以下是一些在C#中验证URI的代码:

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
    //Do something with your validated Absolute URI...
}

答案 2 :(得分:5)

假设我们只想支持绝对URI和HTTP请求,这里有一个能够做你想要的功能:

public static bool IsValidURI(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}

答案 3 :(得分:1)

就我而言,我只是想测试uri,我不想放慢测试uri的应用程序。

Boolean IsValidUri(String uri){
  return Uri.IsWellFormedUriString(uri, UriKind.Absolute);
}

答案 4 :(得分:0)

在您的情况下,uri参数是一个绝对路径,它指的是文件位置,因此根据方法的doc,它返回false。请参阅this

答案 5 :(得分:0)

试试看:

private bool IsValidUrl(string address)
    {
        return Uri.IsWellFormedUriString(address, UriKind.RelativeOrAbsolute);
    }