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

Man*_*uel 62 .net c# uri

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

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

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了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));
Run Code Online (Sandbox Code Playgroud)

输出将是:

Uri.IsWellFormedUriString says: False
IsValidUri says: True
Run Code Online (Sandbox Code Playgroud)

更新/应答

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

Fra*_*nov 72

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

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

更新:回答你的问题 - 正如Uri文档所示,有一个静态方法被调用TryCreate,它将完全按你想要的方式尝试并返回true或false(Uri如果为true则返回实际实例).

  • 根据 .Net 来源 [IsWellFormedUriString 方法包含 TryCreate 方法调用和额外检查](http://referencesource.microsoft.com/#System/net/System/UriExt.cs,24b1613846e7f879),因此我更喜欢使用 IsWellFormedUriString方法对于此类任务更强大。 (3认同)

Dis*_*Dev 32

由于接受的答案没有提供明确的示例,因此这里有一些代码用于验证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...
}
Run Code Online (Sandbox Code Playgroud)

  • @ No1Lives4Ever你是正确的,它解析为你提到的有效,但这在技术上没有错.英文解释:使用http协议(**http://**),使用显式(但省略)端口(http)连接到"http"(http://**http**)的DNS条目:// http**:**) - 所以我假设协议的默认值; 你提供了一个空的第一级文件夹(http:// http:**//**),但我知道你的意思;)后跟路径段"google.com"(http:// http://**google.com/**)然后是资源"page"(http:// http://google.com/**page**) (5认同)
  • 不要相信Uri.TryCreate函数!这也将允许错误的URL.试试这个'http:// http:// google.com/page'(删除空格).此URL传递TryCreate函数,但这是错误的. (2认同)

cdi*_*ins 8

假设我们只想支持绝对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;
}
Run Code Online (Sandbox Code Playgroud)

  • 根据.Net消息来源,[您的第二次检查**!Uri.TryCreate(uri,UriKind.Absolute,out tmp)**是多余的,因为IsWellFormedUriString方法已经包含TryCreate方法调用](http://referencesource.microsoft.com /#System/net/System/UriExt.cs,24b1613846e7f879) (5认同)