none
Error al acceder a webApi por culpa de la variables de navegacion del modelo entity framework utilizado RRS feed

  • Pregunta

  • Buenas tardes. 

    Estoy empezando con este tipo de proyecto y con el MVC 4, por lo que estoy muy verde en esto. Es la primera vez que tengo que desarrollar un proyecto WEB API con MVC 4  tras hacer algunos ejemplos tontos tengo unas dudas que me surgen y no se como solucionar.

    el problema es que tengo un modelo de datos de ENtity framework y una de las entidades es por ejemplo:

            

        public partial class Categoria
        {
            public Categoria()
            {
                this.SubCategorias = new HashSet<SubCategoria>();
                this.Articulos = new HashSet<Articulo>();
            }

            public int Id { get; set; }
            public string Descripcion { get; set; }

            public virtual ICollection<SubCategoria> SubCategorias { get; set; }
            public virtual ICollection<Articulo> Articulos { get; set; }
        }

    pues bien, lo que me ocurre es que cuando las tablas de subcategorias o la de artículos tiene datos, no me deja ver el xml generado en el navegador cuando uso el método GET. si lo hago desde ajax por ejemplo y me lo devuelve el JSON, tampoco me deja. el error que me genera es el siguiente:

    <Error debug="true">
    <script id="FirebugLite" firebugIgnore="true" extension="Chrome"/>
    <Message>Error.</Message>
    <ExceptionMessage>
    El tipo 'ObjectContent`1' no pudo serializar el cuerpo de respuesta para el tipo de contenido 'application/xml; charset=utf-8'.
    </ExceptionMessage>
    <ExceptionType>System.InvalidOperationException</ExceptionType>
    <StackTrace/>
    <InnerException>
    <Message>Error.</Message>
    <ExceptionMessage>
    No se espera el tipo 'System.Data.Entity.DynamicProxies.Categoria_0C6CB543AAEBCF6289E8988086780021C2DEC3A70CDAE273356D12AE4050DBB4' con el nombre de contrato de datos 'Categoria_0C6CB543AAEBCF6289E8988086780021C2DEC3A70CDAE273356D12AE4050DBB4:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'. Intente usar DataContractResolver o agregar tipos no conocidos estáticamente a la lista de tipos conocidos (por ejemplo, usando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos que se pasa a DataContractSerializer).
    </ExceptionMessage>
    <ExceptionType>
    System.Runtime.Serialization.SerializationException
    </ExceptionType>
    <StackTrace>
    en System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) en System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) en System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) en WriteArrayOfCategoriaToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract ) en System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) en System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) en System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) en System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) en System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) en System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) en System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) en System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) en System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() en System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)
    </StackTrace>
    </InnerException>

    </Error>

    como puedo corregirlo??? ya que esas variables de navegación no quiero que vallan ni en el xml ni el json. para json me basta con decorar los métodos con [JsonIgnore], pero para el caso del xml no se como hacerlo.

    muchas gracias por vuestra ayuda.

    jueves, 9 de enero de 2014 16:23

Respuestas

  • bueno, parece que he encontrado el problema y la solución. lo expongo aquí por si a alguien le pasa lo mismo.

    el problema es que por ahorrar tiempo para hacer el ejemplo, he usado en los controladores las propias clases generadas por entity framework que tienen metodos virtuales para acceder a las variables de navegacion. esto produce el error que expuse anteriormente. tan solo con quitarle el modificador virtual a dichos metodos, ya funciona. esta no es la solución, ya que dichas clases se generan automáticamente, lo que habría que hacer es meter una capa intermedia entre el controlador y el modelo. pero para probar el ejemplo me es suficiente.

    saludos.

    • Marcado como respuesta Matos83 viernes, 10 de enero de 2014 10:20
    viernes, 10 de enero de 2014 10:19

Todas las respuestas

  • investigando un poco mas, decorando las clases y miembros que quiero serializar en xml con [DataContract] y [DataMember] se supone que debería funcionar, pero sigue sin hacerlo. en json funciona perfectamente. se os ocurre algo?
    viernes, 10 de enero de 2014 8:49
  • bueno, parece que he encontrado el problema y la solución. lo expongo aquí por si a alguien le pasa lo mismo.

    el problema es que por ahorrar tiempo para hacer el ejemplo, he usado en los controladores las propias clases generadas por entity framework que tienen metodos virtuales para acceder a las variables de navegacion. esto produce el error que expuse anteriormente. tan solo con quitarle el modificador virtual a dichos metodos, ya funciona. esta no es la solución, ya que dichas clases se generan automáticamente, lo que habría que hacer es meter una capa intermedia entre el controlador y el modelo. pero para probar el ejemplo me es suficiente.

    saludos.

    • Marcado como respuesta Matos83 viernes, 10 de enero de 2014 10:20
    viernes, 10 de enero de 2014 10:19
  • eliminando el modificador virtual se a corregido, pero también pienso que no es la verdadera solución.
    • Propuesto como respuesta KevinBarrientos martes, 15 de septiembre de 2015 20:49
    lunes, 16 de marzo de 2015 15:54
  • Gracias. Muy útil!
    jueves, 7 de enero de 2016 15:18