繁体   English   中英

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

[英]How to check that a uri string is valid

您如何检查 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 构造函数默认使用绝对类型。 当我尝试使用 Uri.TryCreate 和构造函数时,这导致了差异。 如果您匹配构造函数和 TryCreate 的 UriKind,您确实会得到预期的结果。

格式正确的 URI 意味着符合某些 RFC。 您示例中的本地路径与这些不符。 IsWellFormedUriString文档中阅读更多信息。

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

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

由于接受的答案没有提供一个明确的例子,这里有一些代码来验证 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...
}

假设我们只想支持绝对 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;
}

在我的情况下,我只想测试 uri,我不想减慢测试 uri 的应用程序的速度。

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

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

试试看:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM