Uri.MakeRelativeUri Behavior On Mono - PullRequest
       3

Uri.MakeRelativeUri Behavior On Mono

3 голосов
/ 12 сентября 2010

Я вижу странное (во всяком случае, мне) поведение при использовании MakeRelativeUri на Mono (2.6.7). Возьмите следующий пример:

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, неверно, но любой совет, который может помочь мне получить ожидаемый результат, был бы очень признателен .

Спасибо

Alex

Ответы [ 2 ]

1 голос
/ 12 сентября 2010

В документации Microsoft .NET для Uri.MakeRelativeUri сказано, что для относительного 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.

1 голос
/ 12 сентября 2010

Похоже, что это делает его релевантным для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...