Pregunta

Acabamos de descubrir que estamos obteniendo "Errores de marco”(Según lo informado por los registros de WCF) al ejecutar nuestro sistema en alguna máquina de prueba del cliente.

Todo funciona bien en nuestras máquinas de desarrollo.

Tenemos una clase base abstracta, con atributos conocidos de tipo para todas sus subcases. A una de su subclase le falta el atributo de DataContract.

¡Sin embargo, todo funcionó en nuestra máquina de prueba!

En la máquina de prueba de los clientes, recibimos "error de encuadre" Mostrando los registros de WCF, este no es el mensaje de error que he visto en el pasado cuando se pierde un atributo DataContract o un atributo de tipo conocido.

Deseo llegar al final de esto, ya que ya no podemos tener confianza en nuestra capacidad de probar el sistema antes de darlo al cliente hasta que podamos hacer que nuestras máquinas se comporten como las máquinas del cliente.


Código que intenta mostrar de lo que estoy hablando (no el código real)

    [DataContract()]
    [KnownType(typeof(SubClass1))]
    [KnownType(typeof(SubClass2))] 
    // other subclasses with data members
    public abstract class Base
    {
        [DataMember]
        public int LotsMoreItemsThenThisInRealLife;
    }

    /// <summary>
    /// This works on some machines (not not others) when passed to Contract::DoIt, 
    /// note the missing [DataContract()]
    /// </summary>
    public class SubClass1 : Base
    {
        // has no data members
    }

    /// <summary>
    /// This works in all cases when passed to Contract::DoIt
    /// </summary>
    [DataContract()]
    public class SubClass2 : Base
    {
        // has no data members
    }

    public interface IContract
    {
        void DoIt(Base[] items);
    }

    public static class MyProgram
    {
        public static IContract ConntectToServerOverWCF()
        {
            // lots of code ...
            return null;
        }

        public static void Startup()
        {
            IContract server = ConntectToServerOverWCF();

            // this works all of the time
            server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});

            // this works "in develperment" e.g. on our machines, but not on the customer's test machines! 
            server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
        }
    }

Actualización Me han dicho que el .NET 3.5 SP1 está en todos Las máquinas, todavía no he confirmado esto por mí mismo.

¿Fue útil?

Solución 2

Creo que el problema es que parte de la máquina no tenía 3.5 SP1 en ellos.

Otros consejos

Teníamos un problema similar: un archivo era un contrato de datos correctamente deserializado en todas nuestras máquinas de prueba. Sin embargo, en una máquina de clientes en particular, falló con el error

Nombre de la clase no se puede serializar. Considere marcarlo con el DataContractAttribute atributo y marcar a todos sus miembros que desee serializado con el DataMemberAttribute atributo.

Resulta que el Cusotmer estaba ejecutando .NET Framework 3.0, mientras que todas nuestras pruebas se habían realizado en .NET Framework 3.5 SP1.

Parece que el comportamiento del serializador del contrato de datos es diferente .NET .NET Framework 3.0 y .NET Framework 3.5. En 3.5, si una clase es serializable XML, entonces también es automáticamente contrato de datos en serie. Sin embargo, ese no es el caso con .NET Framework 3.0: la clase debe ser decorada con [DataContract] o [Serializable].

¡Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top