单声道的Uri.MakeRelativeUri行为

时间:2010-09-11 22:00:54

标签: c# mono uri

在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,如果在字符串的开头添加一个额外的斜杠,他会得到我的预期结果(我也试过这个,但无济于事。)

我不确定这是Uri类在单声道中的问题,或者如果我对URI类应该如何工作的理解是有缺陷的,但任何可以帮助我达到预期输出的建议都将非常感激

谢谢,

亚历

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

Uri.MakeRelativeUri的Microsoft .NET文档说它应该为相对的Uris抛出InvalidOperationException

您编写的代码会在第一行引发异常:“无效的URI:无法确定URI的格式。”如果我修改代码:

    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文档不一致。