2009-08-07 8 views
1

J'ai envie d'ajouter des en-têtes spécifiques personnalisés sur mon wsdl pour le message de savon entrant donc j'ai ajouté les balises nécessaires dans le noeud d'en-tête du web.config comme ci-dessous:en-têtes personnalisés dans WCF

<headers> 
    <Tag>Value</Tag> 
</headers> 

Cependant, cela fonctionne très bien si la 'Valeur' ​​dans la balise personnalisée est définie sur 'Valeur' ​​quand je change cette valeur, le service la lance en donnant l'erreur ci-dessous;

'DestinationUnreachable - Le message avec' http://localhost:3537/Service1.svc 'ne peut pas être traité sur le récepteur, en raison d'une discordance AddressFilter au niveau de EndpointDispatcher. Vérifiez que les EndpointAddresses de l'expéditeur et du destinataire sont d'accord.

Alors, comment puis-je spécifier des valeurs de variable pour la valeur réelle entre les balises ?? comme dans les modèles d'URL, c'est-à-dire

<headers> 
    <Tag>{variable value here}</Tag> 
</headers> 

Des idées, ou suis-je sur les en-têtes personnalisés dans le mauvais sens? Je ne veux pas utiliser un messageContrat car nous utilisons du savon de style RPC sur le style de document. Une autre chose curieuse est que pour que le message soit valide, la coutume définie dans l'élément d'en-tête doit spécifier un attribut 'IsReferenceParameter = "true"' avec un espace de noms ws-adressage sinon il renvoie l'erreur ci-dessus?

<Tag a:IsReferenceParameter="true">Value</Tag> 

Quelqu'un peut-il m'expliquer cela?

Merci à l'avance

Jon

+0

Veuillez dire où vous avez appris cela. Je pense que vous avez peut-être mal compris quelque chose que vous avez lu. –

Répondre

2

Je ne peux pas vraiment expliquer la question concrète que vous avez - mais généralement, vous devez ajouter des en-têtes personnalisés aux appels WCF dans le code, en utilisant souvent un comportement, plutôt que de web.config. Je ne sais pas si cela fonctionne même, vraiment.

Ce que votre comportement d'en-têtes personnalisés peut faire, bien sûr, est de lire les valeurs qu'il va envoyer à partir d'un fichier de configuration ou d'une table de base de données ou autre chose. Mais si vous voulez vraiment imposer les en-têtes SOAP dans vos messages, je pense que votre meilleur pari serait vraiment d'utiliser des contrats de message. Pourquoi est-ce que vous ne pouvez pas ou ne voulez pas utiliser les contrats de message ?? C'est vraiment le seul but des contrats de message: définir la disposition explicite des messages SOAP, y compris les en-têtes personnalisés.

Voir certains articles et billets de blog sur le sujet:

Ce blog post here montre comment injecter des en-têtes SOAP personnalisés dans le WSDL généré par l'implémentation d'une classe "WsdlExporter" personnalisée. Peut-être que c'est la voie à suivre pour vous?

Beaucoup plus de ressources disponibles si vous venez de google pour cela - c'est un scénario très commun, et beaucoup de gens ont déjà mis en œuvre de nombreuses façons, avec des solutions ingénieuses, et blogué à ce sujet - vous devriez avoir pas de problème pour trouver toutes les réponses là-bas!

Marc

+0

Je veux exiger un en-tête personnalisé du côté service et l'utilisation de la balise d'en-tête affiche la balise dans le document WSDL. Avez-vous une idée de la raison pour laquelle je ne peux pas avoir de valeurs variables dans les balises personnalisées dans le fichier web.config? Jon – Jon

+0

Ah ok, désolé, je n'ai pas attrapé cette partie "exiger l'en-tête dans WSDL". Je ne sais pas comment vous pourriez spécifier un nom de variable comme espace réservé, désolé. Et je crains que la seule solution que je vois pour décrire les en-têtes SOAP dans votre contrat soit en effet un MessageContract. C'est exactement ce qu'il y a là-bas. –

+0

Salut, désolé, je ne pense pas que je l'ai très bien expliqué, dans les nœuds de balises personnalisées je ne veux pas spécifier une variable, je veux que le contenu soit quelque chose que je veux être non seulement "VALUE". par exemple: somevalue uneautrevaleur Lorsque je tente de passer toutes les données autres que « Value » i obtenir l'erreur définie dans mon premier post. – Jon

Questions connexes