在Mono上,Uri.MakeRelativeUri的行为是怎样的?

3

我在使用Mono(2.6.7)的MakeRelativeUri时,遇到了一些奇怪的行为(至少对我来说是奇怪的)。看下面的例子:

var uri1 = new Uri("/somepath/someothersubpath/");
var uri2 = new Uri("/somepath/img/someimg.jpg");

var uri3 = uri1.MakeRelativeUri(uri2);
Console.WriteLine(uri3.OriginalString);

我希望输出结果是"../img/someimg.jpg",但实际输出为"img/someimg.jpg"。我的朋友在Windows/Visual Studio中确认,如果在字符串开头添加一个额外的斜杠,就可以得到我期望的结果(我也尝试过这种方法,但没有成功)。我不确定这是Mono中Uri类的问题还是我对URI类应该如何工作的理解存在缺陷,但任何能帮助我得到期望结果的建议都将不胜感激。谢谢。-Alex
2个回答

1

看起来它正在使其与someothersubpath相关,而不是与其子项相关。

我不确定,但也许可以通过将任何内容附加到第一个字符串来解决这个问题:

var uri1 = new Uri("/somepath/someothersubpath/anything");
var uri2 = new Uri("/somepath/img/someimg.jpg");

var uri3 = uri1.MakeRelativeUri(uri2);
Console.WriteLine(uri3.OriginalString);

有趣。这似乎解决了我的问题,但似乎可能是mono中URI类的问题。感谢您的帮助,希望我们最终能找出原因。 - AlexCuse
这是因为从/somepath/someothersubpath的角度来看,/somepath/img/someimg.jpg实际上应该是img/someimg.jpg。但是,在路径末尾添加斜线/somepath/someothersubpath/应该意味着我们在该目录内部,但似乎Mono忽略了这一点,可能是一个bug。然而,向路径末尾添加新组件会强制其更改为更深层次的视角 :) - aularon
是的,看起来 Mono 正在忽略它。再添加一个斜杠也可以解决问题,也许它只是修剪了末尾的斜杠? - AlexCuse
如果添加另一个斜杠也解决了问题,那很可能是这种情况。 - aularon

1

微软 .NET 文档中 Uri.MakeRelativeUri 的说明指出,对于相对 URI,它应该抛出 InvalidOperationException 异常。

按照您编写的代码,第一行就会抛出异常:"Invalid URI: The format of the URI could not be determined." 如果我修改代码:

    var uri1 = new Uri("/somepath/someothersubpath/", UriKind.RelativeOrAbsolute);
    var uri2 = new Uri("/somepath/img/someimg.jpg", UriKind.RelativeOrAbsolute);

    var uri3 = uri1.MakeRelativeUri(uri2);

然后最后一行抛出了InvalidOperationException:此操作不支持相对 URI。正如文档所说的那样。

因此,看起来 Mono 实现与 .NET 文档存在分歧。


抱歉,似乎我的表达不够清晰。我使用了UriKind.Absolute,但由于结果两种方式都一样,所以我将其省略了。在这种情况下,我实际上也要将其解析到文件系统中(其中这些是绝对路径)。 - AlexCuse
当关键信息被遗漏时,很难给出有见地且相关的答案。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接