2010-05-13 18 views
7

Acabo de empezar a estudiar WCF porque lo necesito para una tarea escolar. Pero tengo un problema cuando intento enviar un objeto con algunos atributos personalizados. El objeto es:Enviar objetos con atributos personalizados a través de un servicio wcf

[DataContract] 
public class Person 
{ 
    [DataMember] 
    [Searchable("ID")] 
    public virtual String ID 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    [Searchable("LastName")] 
    public virtual String LastName 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    [Searchable("FirstName")] 
    public virtual String FirstName 
    { 
     get; 
     set; 
    } 
} 

El atributo personalizado es:

[DataContract] 
[AttributeUsage(AttributeTargets.Property)] 
public class Searchable:Attribute 
{ 
    public Searchable(String PropertyName) 
    { 
     this.PropertyName = PropertyName; 
    } 

    [DataMember] 
    public virtual String PropertyName 
    { 
     get; 
     set; 
    } 
} 

utilizo svcutil para generar el archivo de configuración y el cliente. La comunicación entre el cliente y el servicio está funcionando bien. Pero cuando recibo un objeto del tipo Persona y trato de buscar el atributo del tipo Buscable no puedo encontrar ninguno.

¿Esto es posible? En caso afirmativo, ¿podría dar alguna pista sobre cómo lograr este tipo de comportamiento?

Gracias. Denis.

Respuesta

15

WCF es un servicio basado en mensajes: usted serializa su mensaje por un lado, lo envía al otro lado y lo recibe del otro lado. No está enviando los objetos como lo indica, solo envía mensajes serializados. ¡Esa es una diferencia bastante importante!

Su servidor y cliente están totalmente separados: no comparten nada más que la descripción del servicio (la lista de métodos de servicio) y los contratos de datos en forma de esquema XML.

Lo que se obtiene cuando se crea un cliente es un sustituto de los métodos de servicio, y una copia del contrato de datos (se ve igual, pero diferente espacio de nombres, por lo general) que tiene el mismo firma en el serializado formato. Eso es todo lo que hay. Obtiene una nueva clase separada en el lado del cliente, que se serializará en el mismo formato que su clase original en el lado del servidor.

Esto significa que obtendrá los mismos campos y propiedades, pero eso es todo. Cualquier otra cosa (como las interfaces que se implementan, atributos .NET y más) son no replicados. No pueden ser, después de todo, WCF es interoperable, el cliente podría ser una aplicación PHP o un programa Ruby. ¿Cómo van a manejar los atributos personalizados de .NET?

En resumen: todo lo que sea específico de .NET y vaya más allá de la simple representación de datos basada en el esquema XML no se puede utilizar en un servicio WCF.

Hay un agujero del lazo - si el control de ambos extremos de la comunicación - tanto en el servidor y el cliente - y ambos son NET, a continuación, usted podría:

  • poner todos sus contratos de servicios y datos en una separada , ensamblado compartido referencia
  • que el montaje en su implementación del servicio en el lado del servidor
  • de referencia que el montaje en su cliente proxy lado

el uso de este, se le ha ve un conjunto con el mismo tipo de datos tanto en el servidor como en el lado del cliente, y con esta "laguna", puede conservar características .NET como atributos entre el servidor y el cliente.

+0

Gracias Marc por la respuesta rápida. De alguna manera pensé eso después de que ya publiqué la pregunta. Tengo el control tanto del cliente como del servidor; sin embargo, no creo que crear esta referencia a una biblioteca común sea bueno a largo plazo. ¿Alguna idea sobre cómo podría hacer que el atributo sea accesible por otros medios? –

+0

@Denis Rosca: no hay otro medio, lo siento. Si usa la forma estándar de agregar una referencia WCF, como dije, ** solo ** obtiene lo que se serializa en el mensaje XML (y se deserializa de nuevo) y eso no incluye los atributos personalizados de .NET, lo siento. –

0

Llegué a este mismo problema hoy (6 años después, lo sé). De todos modos, lo que me estaba encontrando era un problema donde estaba enviando la propiedad ExtensionData a un proceso almacenado en el lado del servidor que no quería enviar. Entonces mi problema fue completamente del lado del servidor. Todo lo que necesito hacer es declarar los atributos en mi servicio wcf y, al crear mis parámetros, simplemente obtengo los que están decorados con el atributo correcto, así que no estoy enviando esa propiedad junto con mis otras propiedades/parámetros.

Cuestiones relacionadas