2009-09-07 5 views
5

Je suis en train de maintenir une collection d'objets en fonction de leur URI:Pourquoi le fragment d'un Uri est-il ignoré dans la méthode Equals?

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

Cependant, l'URI diffère régulièrement que basée sur le fragment du Uri. Donc, ce qui suit provoque une erreur:

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. 

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

The Equals method compares the two instances without regard to user information (UserInfo) and fragment ( Fragment) parts that they might contain. For example, given the URIs http://www.contoso.com/index.htm#search and http://user:[email protected]/index.htm , the Equals method would return true.

Je suis résigné à avoir à pirater autour de cela. Mais pourquoi se comporte-t-il de cette façon? Je peux voir la logique de l'info-utilisateur, mais pas pour le fragment.

+0

Tous les frameworks RDF avec lesquels j'ai travaillé ont dû implémenter leur propre classe Uri comme système .NET. L'implémentation Uri ne maintient pas la pureté de l'Uri d'origine. Vous pouvez utiliser System.Uri.OriginalString pour éviter cela sur un projet plus petit ... des problèmes similaires surgiront encore et encore bien. –

Répondre

9

De RFC 2396:

4.1. Fragment Identifier

When a URI reference is used to perform a retrieval action on the identified resource, the optional fragment identifier, separated from the URI by a crosshatch ("#") character, consists of additional reference information to be interpreted by the user agent after the retrieval action has been successfully completed. As such, it is not part of a URI, but is often used in conjunction with a URI.

L'accent ajouté est à moi et est la raison pour laquelle le fragment n'est pas pris en compte dans la mise en œuvre de Uri.Equals.

Dans votre exemple, l'URI de la ressource que vous extrayez est: http://www.w3.org/2002/07/owl

Les fragments sont traités par l'agent utilisateur et ont aucun sens ou influence sur la récupération réelle de la ressource.

+0

Bien repéré. Je suppose que mon problème est maintenant avec le W3C en utilisant des fragments comme identifiants uniques lors du référencement des éléments d'ontologie. (Les échantillons que j'ai utilisés étaient cohérents avec leur documentation OWL). À votre santé. – Adrian

+1

@Adrian: Uri n'est pas une classe scellée. Vous pouvez accomplir ceci en dérivant votre propre classe d'Uri qui modifie le comportement Equals pour également regarder le fragment. –

0

Je suppose que 2 URI identiques en dehors du fragment font toujours référence à la même ressource, juste un emplacement différent dans la ressource. Par conséquent, si vous posez la question «S'agit-il de la même ressource?», Par exemple:

alors vous pourriez argumenter qu'il est correct d'ignorer le fragment.

+0

Voici un lien vers la description W3C des fragments dans les URL: http://www.w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1 –

+0

Je peux voir la logique de base. Mais une fois que vous spécifiez un fragment, ne spécifiez-vous pas seulement une partie de la ressource (c'est-à-dire le fragment)? Par exemple. http: // moi/body # leftHand par rapport à http: // moi/body # rightFoot. – Adrian

+0

@Adrian: La ressource entière doit toujours être récupérée par l'agent utilisateur, puis le fragment peut être traité pour diriger l'UA vers la section/fragment approprié de la ressource complète. Il n'y a aucun moyen de récupérer seulement une partie de la ressource. –

Questions connexes