2009-03-11 13 views
16

Acabo de empezar a usar WCF y ya llegué a un problema que altera el proyecto. Creé un servicio y lo puse en referencia en un servicio web, pero cada campo en el archivo xml de servicio web viene con un campo ExtensionData.WCF: ¿Hay alguna manera de eliminar el campo ExtensionData?

Ejemplo:

eliminado ImageShack vínculo roto

no quiero esto. Necesito que sea única:

eliminado enlace ImageShack muertos

¿Hay una manera de eliminar este campo? Algún tipo diferente de serialización?

+0

¿Puede ser más específico? ¿Qué quieres decir con "cada campo en el ... archivo xml"? Los archivos XML no tienen campos. ¿Dónde ves ExtensionData y por qué es un problema? –

Respuesta

2

ExtensionData se utiliza para mantener la compatibilidad entre servicios que pueden compartir contratos de diferentes versiones. Se puede ignorar de forma segura al pasar mensajes.

Es posible que pueda deshacerse de él utilizando algo que no sea el serializador DataContract (estoy pensando en la vieja escuela [Serializable]), pero podría estar equivocado.

10

ExtensionData es en realidad una función que debe incorporarse en el tipo para habilitar round-tripping. Siempre es emitido por el DataContractSerializer. Una forma posible de suprimir este campo está utilizando el XmlSerializer anterior al decorar su interfaz de contrato de servicio con el XmlSerializerFormatAttribute.

+0

esto es estúpido porque si estás tratando de comparar el objeto para un PUT y asegúrate de que vuelva el mismo objeto, las pruebas de tu unidad fallan debido a este estúpido campo que tiene datos en la respuesta pero no en la solicitud – PositiveGuy

+0

@MSSucks tal vez ¿sus pruebas unitarias deberían estar comprobando las propiedades estáticamente y no a través del enlace tardío o en tiempo de ejecución? – moarboilerplate

0

no responder a la pregunta, pero tal vez esto ayude ...

De MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx:

La función de la ida y vuelta puede ser apagado, ya sea mediante el establecimiento de ignoreExtensionDataObject a true en el constructor o DataContractSerializer estableciendo la propiedad IgnoreExtensionDataObject en true en ServiceBehaviorAttribute. Cuando esta característica está desactivada, el deserializador no rellenará la propiedad ExtensionData, y el serializador no emitirá el contenido de la propiedad.

+2

Establecer el valor en verdadero no hace que la propiedad ExtensionData desaparezca; solo evita enviar datos, si los hay, al cliente. –

3

Es muy probable que sus clases de DataContract implementen la interfaz IExtensibleDataObject, ¿verdad? Ese es el responsable del campo ExtensionData; simplemente elimine esa interfaz y también podrá eliminar los campos ExtensionData de sus DataContracts.

Marc

+6

Pero la interfaz está implícita, ¿cómo puedes eliminarla? – SteveC

-1

decorar tu ServiceImplementation con [ServiceBehavior (IgnoreExtensionDataObject = true)]

[ServiceBehavior(IgnoreExtensionDataObject=true)] 
public class Service : IService {} 
2

Al establecer la propiedad de null evitar que aparezca en el XML resultante:

foreach(var elem in arrayOfElements) 
{ 
    elem.ExtensionData = null; 
} 
+0

Por mucho que no me guste usar hacks, esta fue una solución muy rápida (temporal). +1 –

0

Si su problema está en una afirmación de un [TestMethod] usted puede usar http://www.fluentassertions.com para excluir cada propiedad de ExtensionData de tus afirmaciones.

Por ejemplo.

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData)); 
0

Su clase no debe heredar IExtensibleDataObject.

Por favor refiérase a la descripción de la Ronda de disparo a continuación:

El ida y vuelta de se produce cuando los datos se transfieren de una nueva versión de una versión antigua y se transfiere a la nueva versión del contrato de datos. Bypass asegura que no se pierdan datos. Al desactivar la derivación, el tipo anterior es compatible con cualquier cambio futuro admitido por el modelo de versión de contrato.

Para habilitar viaje de disparo para un tipo particular, el tipo debe ejecutar la interfaz de

IExtensibleDataObject

.

La interfaz de usuario contiene un atributo ExtensionData (ExtensionDataObject). La propiedad almacena cualquier información de versiones futuras del contrato de datos que no se conoce en la versión actual.

Cuestiones relacionadas