2009-09-07 9 views
5

estoy tratando de mantener una colección de objetos en función de su URI:¿Por qué se ignora el Fragmento de un Uri en el método Equals?

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

Sin embargo, el URI regularmente única diferencia basado en el fragmento de la URI. Por lo tanto, la siguiente provoca un error:

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. 

por 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.

me he resignado a tener que cortar alrededor de este. Pero, ¿por qué se comporta de esta manera? Puedo ver la lógica para la información del usuario, pero no para el fragmento.

+0

Cualquiera de los marcos RDF con los que he trabajado han tenido que implementar su propia clase Uri como .NET System.Uri implementación no mantiene la pureza del Uri original. Podría usar System.Uri.OriginalString para evitar esto en un proyecto más pequeño ... sin embargo, problemas similares surgirán una y otra vez. –

Respuesta

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.

El énfasis añadido es mío y es la razón del fragmento no se considera en la implementación Uri.Equals.

En el ejemplo, el URI para el recurso que va a recuperar es: http://www.w3.org/2002/07/owl

Los fragmentos son procesados ​​por el agente de usuario y no tienen ningún significado o influencia en la recuperación real del recurso.

+0

Bien visto. Creo que mi problema ahora es que el W3C use fragmentos como identificadores únicos al hacer referencia a elementos de ontología. (Las muestras que utilicé fueron consistentes con su documentación OWL). Aclamaciones. – Adrian

+1

@Adrian: Uri no es una clase sellada. Podrías lograr esto derivando tu propia clase de Uri que modifica el comportamiento Equals para también mirar el fragmento. –

0

Supongo que 2 URI que son idénticos aparte del fragmento todavía se refieren al mismo recurso, solo una ubicación diferente dentro del recurso.

Así que si estás haciendo la pregunta '¿son estos el mismo recurso?' entonces podrías argumentar que es correcto ignorar el fragmento.

+0

Aquí hay un enlace a la descripción del W3C de los fragmentos en las URL: http://www.w3.org/TR/WD-html40-970708/htmlweb.html#h-4.1.1 –

+0

Puedo ver la lógica básica. Pero una vez que especifique un fragmento, ¿no está especificando solo una parte del recurso (es decir, el fragmento)? P.ej. http: // me/body # leftHand versus http: // me/body # rightFoot. – Adrian

+0

@Adrian: El agente de usuario aún debe recuperar el recurso completo y luego el fragmento puede procesarse para apuntar el UA a la sección/fragmento apropiado del recurso completo. No hay forma de recuperar solo una parte del recurso. –

Cuestiones relacionadas