【问题标题】:Uri class is very brittle and seems to throw exceptions excessivelyUri 类非常脆弱,似乎过度抛出异常
【发布时间】:2020-05-12 19:30:41
【问题描述】:

我正在编写一个网络蜘蛛,并注意到Uri 类非常脆弱。

很多锚href 属性包含'/' 之类的东西,但是Uri 类阻塞了很多。例如:

Uri uri = new Uri("/");

无效的 URI:无法确定 URI 的格式。

显然,我希望我的代码能够健壮。在href 值是部分路径的情况下,我使用Uri 类使其成为绝对路径。但是,如果它窒息了,那就行不通了。

有没有其他人处理过这个问题。有没有办法让Uri 类更可靠一点?

【问题讨论】:

    标签: c# .net .net-core uri


    【解决方案1】:

    根据 Wikipedia,URI 方案(URL 的 protocoll)不是可选的

    后跟冒号 (:) 的非空方案组件,由以字母开头并后跟字母、数字、加号 (+)、句点 (.) 或连字符 ( -)。尽管方案不区分大小写,但规范形式是小写的,并且指定方案的文档必须使用小写字母。流行方案的示例包括 http、https、ftp、mailto、file、data 和 irc。 URI 方案应在 Internet 号码分配机构 (IANA) 注册,但实际上使用的是非注册方案。

    因此,您的 Uri uri = new Uri("/"); 示例代码不符合规则。

    这个异常抛出并不过分,因为它阻止你输入一些可验证无效的东西。充其量你可以为vexing exceptions, but really it sounds more like boneheaded 争论。

    【讨论】:

    • 对于我正在做的事情,例外太多了。但我发现我可以使用 Uri.TryCreate() 来做一些更强大的事情。
    • @JonathanWood 你在那里构建的东西(还没有)一个 URI。它可能会成为 URI laster 的一部分,因为您将其他 stings 连接到它没有其他点开始没有 shema 或者不只是添加带有 shema 的前导斜线。
    【解决方案2】:

    System.Uri(string) 的构造函数是 documented 仅接受 绝对 URIs,而不是“相对 URIs”(更恰当地称为 相对引用 到一个 URI;参见 RFC 3986 的 1.2 和 4.2 节),并且在遇到诸如 / 的相对引用时会抛出异常。

    【讨论】:

    • 是的,我明白了。我只是想为那些不想让代码失败的人找出解决方法。看起来Uri.TryCreate() 可能是答案。
    【解决方案3】:

    Uri.TryCreate() 确实是我要找的。​​p>

    在解析从 Internet 下载的页面时,不知道链接将包含什么内容。由于您不希望代码在每次发现虚假内容时都抛出错误,因此如果给定的字符串无效,Uri.TryCreate() 只需返回 false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2012-12-18
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多