2010-05-11 6 views
0

Nous venons de trouver que nous obtenons "erreurs de cadrage" (tel que rapporté par les journaux WCF) lors de l'exécution de notre système sur une machine de test client.Pourquoi nous obtenons une erreur de cadrage WCF sur certaines machines

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. Une de ses sous-classes manque son attribut DataContract.

Cependant, tout a fonctionné sur notre machine de test!

Sur les clients de tester la machine, nous nous sommes « cadrage erreur » 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 souhaite aller au fond de cela, que nous ne pouvons plus avoir confiance dans notre capacité à tester le système avant donner au client jusqu'à ce que nous pouvons rendre nos machines se comporter certains comme les machines du client.


code qui tentent 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 } }); 
     } 
    } 

Update on me dit le NET 3.5 SP1 est sur tous les machines, je n'ai pas encore confirmé cela pour moi-même.

Répondre

0

Je crois que le problème est qu'une partie de la machine n'avait pas 3.5 SP1 sur eux.

2

Nous avons rencontré un problème similaire: Un fichier était correctement désérialisé par 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é. Envisagez de le marquer avec l'attribut DataContractAttribute et de marquer tous ses membres que vous souhaitez sérialiser avec l'attribut DataMemberAttribute.

Il s'avère que le cusotmer exécutait .NET Framework 3.0, alors que tous nos tests avaient été effectués sur .NET Framework 3.5 SP1.

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

Espérons que cela aide!

Questions connexes