2009-02-09 4 views
1

J'ai un RESTful service que je développe dans WCF. J'expose un contrat qui n'a pas de types sérialisables, donc j'utilise un DataContractSurrogate (implémentation de IDataContractSurrogate) pour créer des substituts qui peuvent être sérialisés avec le DataContractSerializer.Est-il possible de lire les en-têtes de requête à partir de l'implémentation de WCata IDataContractSurrogate?

Ma question est, comment puis-je accéder aux en-têtes de demande/réponse dans ma classe DataContractSurrogate?

Dans le service, il est possible en utilisant simplement WebOperationContext et dans le client même WebOperationContext est accessible dans le cadre d'un objet OperationContextScope qui peut être créé avec une référence au courant WCF Channel (IContextChannel).

Je pourrais créer un OperatoinContextScope si j'étais capable d'obtenir une référence au canal WCF au sein de IDataContractSurrogate.GetDeserializedObject mais je ne suis pas sûr de savoir comment faire cela non plus.

Des idées?


@casperOne:
Je veux obtenir la valeur d'en-tête dans la mise en œuvre de DataContractSurrogate parce que pour convertir la mère porteuse du type cible que je dois faire référence à une entrée dans un pool singleton d'objets d'usine.

Quelque chose comme ceci:

SingletonFactoryPool.Factories[factoryIdFromHeader].CreateTargetType(surrogateValues); 

Je suis déjà passer les données dont j'ai besoin dans les en-têtes pour d'autres raisons, il semble que ce serait plus propre si je pouvais lire la valeur de l'en-tête. Votre point est valide cependant, je pourrais facilement passer les mêmes données dans la mère porteuse.

Répondre

0

Si vous devez accéder au canal dans le contrat de données, je dirais que votre classe est mal conçue. Votre contrat doit être autonome et ne pas dépendre des valeurs d'en-tête utilisées pour transmettre le message via le canal.

Vous pouvez toujours créer une extension (il y a un certain nombre de zones possibles) qui prendrait l'instance désérialisée et y ajouterait les informations d'en-tête que vous devez ajouter. Et bien sûr, vous pouvez toujours créer un objet séparé qui est un amalgame de l'instance désérialisée (passée à travers les paramètres) et des informations d'en-tête.

+0

mis à jour la poste avec quelques précisions supplémentaires sur les raisons pour lesquelles j'essaie d'accéder aux en-têtes de l'implémentation IDataContractSurrogate. la réponse était trop longue pour un commentaire –

Questions connexes