2009-01-29 11 views
8

¿Por qué razón (es) debería WCF devolverme un objeto instanciado "vacío" cuando estaba claramente poblado en mi devolución de servicio WCF antes de que pasara por el cable?Objeto personalizado que devuelve como "vacío" de WCF?

Por ejemplo un simple OperationContract método:

response.Client = new Client(); 
response.Client.ID = 99; 
return response; 

devuelve un objeto de cliente "vacío" (en el extremo receptor del cliente) y todos los campos son o bien nulo o cero. Sin embargo, justo antes de la respuesta, si inspecciono response.Client.ID, ¿está lleno con 99?

Sólo para empeorar las cosas, tengo un objeto de error y yo pueblan tales como:

response.Errors.Add(new CodedError(Errors.ErrorCodes.LOGIN_AUTHENTICATION_ERROR)); 

Sin embargo, puedo ver la lista de errores en el extremo receptor con esto?

Respuesta

8

Si alguien encuentra este problema, he encontrado la solución. Debido a los requisitos comerciales, he marcado mi clase personalizada con [Serializable] y [DataContract], esto parece ser ilegal posiblemente a partir de .NET 3.5 SP1.

Tengo un amigo que está enviando objetos WCF con estos dos atributos pre .NET 3.5 SP1 y está funcionando bien. Interesante.

FYI, simplemente utilicé [Serializable] y se envía a través de mi gráfico de objetos correctamente. Lo necesitaba para la serialización xml en la pista.

Este era un tema doloroso, pero contento de que está funcionando ahora por fin ....

+1

¿Qué pasó con [DataMemebers], también los cambias a [Serializable]? – sebagomez

3

¿Su objeto está marcado como [Serializable] o es un [DataContract]? Debe marcar su objeto como uno o el otro.

WCF solo sabe cómo pasar primitivas u objetos serializables a través del cable.

+0

Sí, el modelo está marcado como ambos en realidad, ya que necesito la serialización en el extremo del cliente que se realizará para guardar en el archivo. – GONeale

+0

Interesante. No tengo nada en este punto. Lo pensaré un poco más. –

+0

Np. Es difícil no ver mi modelo, pero es un modelo bastante estándar, aunque uno supondría que el modelo de error funciona. El modelo de cliente no funciona. Hay incompatibilidades entre los modelos, así que estoy tratando de reducirlo ya que el Cliente tiene otro objeto personalizado, y ver qué hace ... – GONeale

2

¿El proxy del cliente está actualizado? Lo he visto suceder cuando el contrato cambia y el cliente no se actualiza para reflejar el cambio.

+0

Gracias por los comentarios MattK, como pueden ver, resolví de qué se trataba :( – GONeale

1

que tenía el mismo problema. Cambié el espacio de nombres en los objetos del lado del servidor y aunque había actualizado la configuración de Referencia del servicio, mirando más de cerca el espacio de nombres era el antiguo, así que mientras el violinista confirmaba que los datos se transferían a través del cable correctamente, los datos no se pasaban a mi objeto cliente Eliminar y volver a agregar la referencia de servicio hizo el truco

2

Podría ser demasiado tarde ahora, pero hay una solución fácil para este problema en particular. Al menos alguien encontrará esto útil.

Tengo 2 proyectos con diferentes espacios de nombres.

  1. MyProject.Business.Entities (marcado con [DataContract])
  2. MyProject.Client.Entities (entidades lado del cliente para representar objetos de negocio)

Use los AssemblyInfo.cs y agregue la siguiente línea a cada proyecto de Negocio y Cliente.

[assembly: ContractNamespace("http://www.tempuri.org/MyProject", 
           ClrNamespace = "MyProject.Business.Entities")] 

[assembly: ContractNamespace("http://www.tempuri.org/MyProject", 
           ClrNamespace = "MyProject.Client.Entities")] 

O bien, puede hacer esto también.

[DataContract (Namespace = "http://www.tempuri.org/MyProject")] 
public class Account 
{} 
Cuestiones relacionadas