【问题标题】:Why is the Fragment of a Uri ignored in the Equals method?为什么在 Equals 方法中忽略 Uri 的片段?
【发布时间】:2009-09-07 01:54:18
【问题描述】:

我正在尝试根据它们的 URI 维护一组对象:

public class ConceptCollection : KeyedCollection<Uri, Concept> {
    protected override Uri GetKeyForItem(Concept item) {
        return item.Uri;
    } 
}

但是,URI 通常只会根据 Uri 的片段而有所不同。因此,以下导致错误:

ConceptCollection wines = new ConceptCollection();
Concept red = new Concept("http://www.w3.org/2002/07/owl#RedWine");
Concept white = new Concept("http://www.w3.org/2002/07/owl#WhiteWine");
wines.Add(red);
wines.Add(white); // Error: An item with the same key has already been added.

http://msdn.microsoft.com/en-us/library/f83xtf15.aspx:

Equals 方法比较两者 不考虑用户的实例 信息(UserInfo)和片段( 片段)部分,他们可能 包含。例如,给定 URI http://www.contoso.com/index.htm#searchhttp://user:password@www.contoso.com/index.htm, Equals 方法将返回 true。

我已经接受了不得不解决这个问题。但是为什么它会这样呢?我可以看到用户信息的逻辑,但不能看到片段。

【问题讨论】:

  • 我使用过的任何 RDF 框架都必须实现自己的 Uri 类,因为 .NET System.Uri 实现不保持原始 Uri 的纯度。您可以在较小的项目中使用 System.Uri.OriginalString 来避免这种情况......不过,类似的问题会一遍又一遍地出现。

标签: c# uri


【解决方案1】:

来自RFC 2396

4.1。片段标识符

当使用 URI 引用对标识的资源执行检索操作时,可选的片段标识符(由交叉线(“#”)字符与 URI 分隔)包含要由用户代理解释的附加引用信息后 检索操作已成功完成。 因此,它不是 URI 的一部分,但通常与 URI 结合使用。

添加的重点是我的,也是 Uri.Equals 实现中不考虑片段的原因。

在您的示例中,您要检索的资源的 URI 是:http://www.w3.org/2002/07/owl

片段由用户代理处理,对资源的实际检索没有任何意义或影响。

【讨论】:

  • 很好看。我想我现在的问题是 W3C 在引用本体元素时使用片段作为唯一标识符。 (我使用的样本与他们的 OWL 文档一致)。干杯。
  • @Adrian:Uri 不是密封类。您可以通过从 Uri 派生您自己的类来修改 Equals 行为以查看片段来完成此操作。
【解决方案2】:

我猜是因为除了片段之外,两个相同的 URI 仍然引用相同的资源,只是资源中的不同位置。

因此,如果您要问“这些资源是否相同?”那么你可以争辩说忽略片段是正确的。

【讨论】:

  • 这里是 W3C 对 URL 中片段的描述的链接:w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1
  • 我可以看到基本逻辑。但是一旦你指定了一个片段,你是不是只指定了资源的一部分(即片段)。例如。 me/body#leftHandme/body#rightFoot
  • @Adrian:整个资源仍必须由用户代理检索,然后可以处理片段以将 UA 指向完整资源的适当部分/片段。无法仅检索资源的一部分。
猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
相关资源
最近更新 更多