Pourquoi nous obtenons un WCF « erreur de cadrage » sur certaines machines, mais pas d'autres

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

Question

Nous avons juste trouvé que nous obtenons « erreurs de cadrage » (tel que rapporté par les journaux de WCF) lors de l'exécution de notre système sur une machine de test client.

Tout fonctionne bien sur nos machines de développement.

Nous avons une classe de base abstraite, avec des attributs KnownType pour toutes ses sous-classes. L'une des sous-classe de ce manque, il est DataContract attribut.

Mais tout a parfaitement fonctionné sur notre machine de test!

Sur les clients de tester la machine, nous avons eu « erreur de cadrage » montrant les journaux WCF, ce n'est pas le message d'erreur que je l'ai vu dans le passé lorsque manque un attribut DataContract, ou un attribut KnownType .

  

Je veux aller au fond de cela,   que nous ne pouvons plus avoir confiance en   notre capacité à tester le système avant   donnant au client jusqu'à ce que nous   font nos machines se comportent les uns comme   Les machines du client.


Le code qui essaie de montrer ce dont je parle, (pas le code réel)

    [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 } });
        }
    }

Mise à jour m'a dit le NET 3.5 SP1 est sur tous les machines, je reste à comfirm pour moi-même.

Était-ce utile?

La solution 2

Je crois que le problème est que certains de la machine n'avait pas 3,5 SP1 sur eux.

Autres conseils

Nous avons eu un problème similaire: Un fichier a été correctement désérialisation de contrat de données sur toutes nos machines de test. Cependant, sur une machine client particulier, il a échoué avec l'erreur

  

ClassName ne peut pas être sérialisé. Pensez à le marquer avec l'attribut DataContractAttribute et marquer tous ses membres que vous voulez sérialisé avec l'attribut DataMemberAttribute.

Transforme que le cusotmer a été en cours d'exécution .NET Framework 3.0, alors que tous nos tests ont été effectués sur .NET Framework 3.5 SP1.

Il semble que le comportement du contrat de données sérialiseur est différent accross .NET Framework 3.0 et .NET Framework 3.5. Le 3.5, si une classe est sérialisable XML, il est automatiquement contrat de données sérialisable également. Cependant, ce n'est pas le cas avec .NET Framework 3.0 -. La classe doit être décorée avec [DataContract] ou [Serializable]

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top