2010-09-11 3 views
3

Je vois un comportement étrange (pour moi quand même) lors de l'utilisation de MakeRelativeUri sur Mono (2.6.7). Prenons l'exemple suivant:Uri.MakeRelativeUri Comportement sur Mono

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

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

Je me attends à la sortie de cette "../img/someimg.jpg", mais je reçois "img/someimg.jpg"

Un ami a confirmé en utilisant des fenêtres/visual studio qu'il obtient mon résultat attendu si une barre oblique supplémentaire annexant à le début de la chaîne (j'ai essayé cela aussi, et en vain). Je ne suis pas sûr si c'est un problème avec la classe Uri en mono, ou si ma compréhension de la façon dont la classe URI devrait fonctionner est erronée, mais tous les conseils qui peuvent m'aider à obtenir la sortie attendue seraient grandement apprécié.

Merci,

Alex

Répondre

1

Il semble que cela rend pertinent pour someothersubpath lui-même, et non à ses enfants.

Je ne suis pas sûr, mais peut-être il est possible de contourner ce problème en ajoutant quoi que ce soit à la première chaîne:

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

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

Intéressant. Cela semble résoudre mon problème, mais il semble que ce soit un problème avec la classe URI en mono. Merci pour l'aide, j'espère que nous serons en mesure de comprendre la cause de cela finalement – AlexCuse

+0

C'est parce que '/ somepath/img/someimg.jpg' est' img/someimg.jpg' du point '/ somepath/someothersubpath' de vue. Mais ajouter une barre oblique à ce chemin en faisant '/ somepath/someothersubpath /' devrait signifier que nous sommes à l'intérieur de ce répertoire, mais il semble que 'Mono' l'ignore, peut-être un bug. Cependant, l'ajout d'un nouveau composant à la fin du chemin l'oblige à changer de point de vue _deeper :) – aularon

+0

Oui, il semble que mono l'ignore. Ajout d'une autre barre oblique fonctionne aussi, peut-être que c'est juste une barre oblique? – AlexCuse

1

La documentation Microsoft .NET pour Uri.MakeRelativeUri dit qu'il devrait jeter InvalidOperationException pour le parent Uris.

Votre code, comme écrit, lève une exception sur la première ligne: "Invalid URI: le format de l'URI n'a pas pu être déterminé." Si je modifie le code:

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

    var uri3 = uri1.MakeRelativeUri(uri2); 

Puis la dernière ligne lancers francs InvalidOperationException: Cette opération est prise en charge par un URI relatif. Tout comme la documentation le dit.

Il semble donc que l'implémentation Mono soit en contradiction avec la documentation .NET.

+0

Désolé, semble que j'aurais dû être plus clair. J'utilisais UriKind.Absolute mais comme les résultats étaient les mêmes, je l'ai laissé de côté. Dans ce cas, je suis en train de résoudre le système de fichiers (où ce sont des chemins absolus). – AlexCuse

+0

Il est plutôt difficile de donner des réponses pertinentes et éclairées lorsque des informations critiques sont omises. –