2012-01-17 29 views
5

cuando corro mi servicio me dieron excepción:serialización POCO proxy con WCF

El servidor encontró un error al procesar la solicitud. El mensaje de excepción es 'No se puede serializar el parámetro de tipo System.Data.Entity.DynamicProxies.Cosik_14C2 ...' (para la operación 'GetCosik', contrato 'ICosikService') porque no es del tipo exacto 'Project.Domain.Entities.Cosik 'en la firma del método y no está en la colección de tipos conocidos. Para serializar el parámetro, agregue el tipo a la colección de tipos conocidos para la operación usando ServiceKnownTypeAttribute. '. Vea los registros del servidor para más detalles.

Soy nuevo en los servicios de WCF y en Entity Framework y agradecería cualquier ayuda/sugerencia.

Estoy usando Entity Framework 4.1. El uso de código primero creé base de datos con dos tablas:

[DataContract(IsReference=true)] 
public class Cosik 
{ 
    [DataMember] 
    public int cosikID { get; set; } 

    [DataMember] 
    public string title { get; set; } 

    [DataMember] 
    public int DifficultyID { get; set; } 
    [DataMember] 
    public virtual Difficulty Difficulty { get; set; } 
} 

[DataContract(IsReference=true)] 
public class Difficulty 
{ 
    [DataMember] 
    public int DifficultyID { get; set; } 

    [DataMember] 
    [Required] 
    public string NameToDisplay { get; set; } 
} 

siguiente que creó la aplicación de servicio WCF y lo hizo REST. A continuación se muestra el código de interfaz:

[ServiceContract] 
public interface ICosikService 
{ 
    [OperationContract] 
    [ApplyDataContractResolver] 
    [WebGet(UriTemplate = "/cosik")] 
    Cosik GetCosik(); 
} 

y ejecución de dicho contrato

public class RecipeService : IRecipeService 
{ 
//repository of Cosik entities - stores collection of all 
//Cosik entities that can be queried from DB 
private ICosikRepository cosikRepo; 
... 

public Cosik GetCosik() 
    { 
     Cosik c = cosikRepo.GetById(1); 
     return c; 
    } 

he implementado clase ApplyDataContractResolverAttribute dada en: http://msdn.microsoft.com/en-us/library/ee705457.aspx y añadió [ApplyDataContractResolver] anotación a GetCosik método. Sin embargo, no ayudó.

¿Alguna sugerencia de lo que me he perdido?

+0

Parece que el * Cosik * en su operación de servicio GetCosik() y que haya marcado como un contrato de datos no es el mismo * Cosik * como se define en el modelo de su entidad y por el cual su servicio intenta volver por algún motivo. –

+0

Todavía obtiene el mismo error si deshabilita la carga diferida en su [ObjectContext] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx) utilizando 'context. ContextOptions.LazyLoadingEnabled = false'? –

+0

Puede agregar [KnownType (Cosik)] sobre su clase RecipeService. – Rajesh

Respuesta

4

En lugar de desarrollar resolución personalizada, desactive la creación del proxy. Los poderes son no para escenarios como WCF debido a la carga diferida deben estar apagados todos modos durante la serialización y el seguimiento de cambios dinámicos no se usa nunca:

context.Configuration.ProxyCreationEnabled = false; 
+0

Al desactivar la creación de proxy, todos mis objetos virtuales (campos) se vuelven nulos y pierdo la funcionalidad proporcionada por EF. Me pregunto si ese es realmente el caso de que tengo que consultar la base de datos para establecer campos virtuales con los datos adecuados por mi cuenta. He revisado muchas páginas explicando cómo usar wcf con ejemplos simples de datos simples, pero los datos simples son bastante escasos en el mundo real. ¿Alguien puede indicarme algunos recursos/tutoriales que explican cómo usar rest wcf con EF en datos más complejos? Ahora uso wcf (sin descanso) y funciona, pero me gustaría aprender a usarlo en rest-way – anetafr

+0

Sus campos virtuales son nulos porque no usó la carga ansiosa. Usar carga diferida en situaciones en las que sabe que necesitará esos datos no es correcto porque EF debe crear una base de datos separada para "cada propiedad". –

+0

@anetafr Para obtener una mejor compatibilidad REST, consulte el tipo de elemento de proyecto 'Servicio de datos WCF', que se puede utilizar con código primero, aunque tiene sus propios obstáculos (http://blogs.msdn.com/b/writingdata_services /archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data-services.aspx). Personalmente, optaría por la opción más limpia de traducir entre entidades y DTO en mi capa de servicio. De todos modos, un par de otras opciones para que pienses ... – kallotec

Cuestiones relacionadas