2010-03-31 2 views
1

J'essaie de transférer des informations d'utilisateur dans l'en-tête du message via les inspecteurs de message.Comment transférer des objets via l'en-tête dans WCF

J'ai créé un comportement qui ajoute l'inspecteur au service (client et serveur).

Mais lorsque je tente de communiquer avec le service que je reçois l'erreur suivante:

XmlException:
nom ne peut pas commencer par le caractère « < », valeur hexadécimale 0x3C.

J'ai également l'exception me disant que DataContracts où inattendu.

Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 'DelegateSerializationHolder.DelegateEntry: http://schemas.datacontract.org/2004/07/System ' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

La chose est que mon objet contient d'autres objets qui sont marqués comme DataContract et je ne suis pas intéressé d'ajouter l'attribut KnownType pour ces types.

Un autre problème pourrait être que mon objet à sérialiser est très limité sous forme de classe interne et les propriétés internes, etc.

Quelqu'un peut-il me guider dans la bonne direction. Qu'est-ce que je fais mal?

Certains code:

public virtual object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    var header = MessageHeader.CreateHeader("<name>", "<namespace>", object); 
    request.Headers.Add(header); 

    return Guid.NewGuid(); 
} 

Répondre

0

Pour fermer cette question, je n'ai jamais résolu l'exception. Au lieu de cela, j'ai implémenté ISerializable qui a bien fonctionné pour moi.

1

Ne placez pas les crochets dans les cordes réelles. Rappelez-vous que le format de sérialisation peut ne pas être basé sur du texte, tout ce que vous faites est de spécifier le nom de l'élément et l'espace de noms. Donc, votre code devrait ressembler plus à ceci:

var header = MessageHeader.CreateHeader("name", "urn:myNamespace", object); 
request.Headers.Add(header); 
+0

Désolé pour le malentendu mais les crochets ne sont là que pour illustrer que c'était un nom et un espace de noms. Je peux voir la confusion en ce qui concerne le message d'erreur. Non, le code réel est sans chevrons, mais l'espace de noms est un espace de noms http: // formatet. – Michael

Questions connexes