【问题标题】:How to check that a uri string is valid如何检查uri字符串是否有效
【发布时间】:2011-06-17 15:24:40
【问题描述】:

如何检查 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,您确实会得到预期的结果。

【问题讨论】:

标签: c# .net uri


【解决方案1】:

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

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

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

【讨论】:

  • 问题是“如何检查 uri 字符串是否有效(您可以将其提供给 Uri 构造函数)?”
  • TryCreate 并没有真正告诉您字符串是否会被构造函数接受。请参阅更新。
  • @Manuel:这根本没有意义 - TryCreateUri 构造函数的结果应该相同 - 尝试传递 UriKind 就像你为 TryCreate 所做的那样.
  • 你是对的。构造函数使用默认类型 Absolute。谢谢。
  • 根据.Net 来源the IsWellFormedUriString method contains the TryCreate method call plus extra checks,因此我更喜欢使用 IsWellFormedUriString 方法,因为此类任务更强大。
【解决方案2】:

由于接受的答案没有提供明确的示例,因此这里有一些用于验证 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.TryCreate 函数!这也将允许错误的 URL。试试这个“http://http://google.com/page”(删除空格)。这个网址通过了 TryCreate 函数,但是是错误的。
  • @No1Lives4Ever 你是正确的,它解析为你提到的有效,但这在技术上并没有错。英文解释:使用http协议(http://),使用显式(但省略)连接到“http”的DNS条目(http://**http**)端口 (http**:**) - 所以我将假设协议的默认值;您提供了一个空的第一级文件夹(http:**//**),但我知道您的意思;)后跟一个路径段“google.com”(http:/**google.com/**)然后是资源“页面”(http://google.com**page**)
【解决方案3】:

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

【讨论】:

【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    试试看:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 我正在使用 UriKind.RelativeOrAbsolute 所以没关系。无论哪种方式,它都不适用于 UriKind.Relative 或 UriKind.Absolute 所以没有运气。
      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 2018-11-15
      • 2010-09-30
      • 1970-01-01
      • 2019-05-05
      • 2019-10-04
      • 1970-01-01
      相关资源
      最近更新 更多