Por que estamos recebendo um "erro de enquadramento" do WCF em algumas máquinas, mas não em outras

StackOverflow https://stackoverflow.com/questions/2809519

Pergunta

Acabamos de descobrir que estamos ficando “erros de enquadramento”(Conforme relatado pelos logs do WCF) ao executar nosso sistema em alguma máquina de teste do cliente.

Tudo funciona bem em nossas máquinas de desenvolvimento.

Temos uma classe base abstrata, com os atributos do KnowType para todas as suas sub -classes. Uma de sua subclasse está faltando seu atributo datacontract.

No entanto, tudo funcionou em nossa máquina de teste!

Na máquina de teste dos clientes, recebemos "erro de enquadramento" Mostrando os logs do WCF, essa não é a mensagem de erro que eu já vi no passado ao perder um atributo Datacontract ou um atributo conhecido.

Desejo chegar ao fundo disso, pois não podemos mais confiar em nossa capacidade de testar o sistema antes de entregá -lo ao cliente até que possamos fazer nossas máquinas se comportarem como as máquinas do cliente.


Código que tenta mostrar do que estou falando (não o 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 } });
        }
    }

ATUALIZA tudo As máquinas, ainda estou para confirmar isso para mim.

Foi útil?

Solução 2

Eu acredito que o problema é que parte da máquina não tinha 3.5 SP1 neles.

Outras dicas

Tivemos um problema semelhante: um arquivo era adequadamente contratado de dados, desertando em todas as nossas máquinas de teste. No entanto, em uma máquina de cliente em particular, ela falhou com o erro

Nome da classe não pode ser serializado. Considere marcá -lo com o DataContractAttribute atribuir e marcar todos os seus membros que você deseja serializar com o DataMemberAttribute atributo.

Acontece que o CUSOTMER estava executando o .NET Framework 3.0, enquanto todos os nossos testes foram feitos no .NET Framework 3.5 SP1.

Parece que o comportamento do serializador de contrato de dados é diferente da estrutura .NET da estrutura .NET 3.0 e .NET Framework 3.5. Em 3.5, se uma classe for serializável em XML, também é automaticamente contrato de dados serializável também. No entanto, esse não é o caso do .NET Framework 3.0 - a classe deve ser decorada com [DataContract] ou [Serializable].

Espero que isto ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top