2010-11-25 37 views
0

J'ai un service qui reçoit des données d'un proxy hébergé dans une WebApp. Les DataMembers sont définis avec Order = * et j'ai également essayé d'ajouter isRequired = true. Le problème est que sur 60 champs d'information sérialisés et désérialisés, les mêmes 3 champs String sont systématiquement manquants (null). J'ai exécuté le débogage qui me montre que les données le rendent du navigateur de client au service de proxy intact (sérialisé de JSON). Le service proxy l'envoie ensuite au service Windows où les 3 champs sont manquants après la désérialisation.WCF DataContract Désérialisation manquante 3 Champs de chaîne même avec l'ensemble d'ordres

J'ai essayé de définir l'ordre des champs différemment mais rien ne semble fonctionner. C'est toujours le même 3 champs manquants simples, souvent pas plus de 10-20 caractères. Il est également important de mentionner que ces DataMembers gênants sont correctement renseignés dans toutes les autres zones du programme.

Le code de service proxy est la suivante

public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo) 
    { 
     MyService.MyServiceClient proxy = new MyService.MyServiceClient("WSHttpBinding_IMyService"); 
     proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
     TransactionResult result = proxy.Update(obj, ItemOne, ItemTwo); 
     proxy.Close(); 
     return result; 
    } 

code service Windows est

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo) 
{obj is missing same 3 values at this point...} 

Un exemple de l'un des DataMembers de l'objet

[DataMember(Order = 56)] 
    public String ItemTwo 
    { 
     get 
     { 
      ... 
     } 
     set 
     { 
      ... 
     } 
    } 

Répondre

0

Idées:

  • assurez-vous que ces champs ne sont pas calculés (et donc remis à zéro ou changé dans votre code, en fonction de l'ordre deserializatin)
  • assurez-vous que vous ne définissez pas d'attribut DefaultValue, comme sérialisation utilise pour optimiser la bande passante
  • faire que vous ne déclarez pas un comportement personnalisé qui pirater ces champs à
  • essayer un autre WCF de liaison (HTTP, NetTcp, ...)
  • crochet du OnDeserialized, OnDeserializing événements et vérifier les données sont là
0

Une chose à vérifier pourrait être que les paramètres supplémentaires de la signature portent le même nom que les propriétés de votre entité.

Pourquoi ne pas renommer les paramètres de signature (rappelez-vous de votre regen référence de service client/proxy)

public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo) 

à

public TransactionResult Update(MyObj obj, String NewItemOne, String NewItemTwo)