J'ai un service WCF qui est hébergé dans un service Windows. Les clients qui utilisent ce service doivent transmettre un identifiant à chaque fois qu'ils appellent des méthodes de service (car cet identifiant est important pour ce que la méthode appelée doit faire). J'ai pensé que c'était une bonne idée de mettre cet identifiant dans les informations d'en-tête WCF.
Si c'est une bonne idée, comment puis-je ajouter automatiquement l'identifiant aux informations d'en-tête. En d'autres termes, chaque fois que l'utilisateur appelle la méthode WCF, l'identificateur doit être automatiquement ajouté à l'en-tête.
MISE À JOUR: les clients qui utilisent le service WCF sont à la fois des applications Windows et des applications Windows Mobile (utilisant Compact Framework).
Réponses:
L'avantage de ceci est qu'il est appliqué à chaque appel.
Créez une classe qui implémente IClientMessageInspector . Dans la méthode BeforeSendRequest, ajoutez votre en-tête personnalisé au message sortant. Cela pourrait ressembler à ceci:
Créez ensuite un comportement de point de terminaison qui applique l'inspecteur de messages à l'environnement d'exécution du client. Vous pouvez appliquer le comportement via un attribut ou via une configuration à l'aide d'un élément d'extension de comportement.
Voici un excellent exemple de la façon d'ajouter un en-tête d'agent utilisateur HTTP à tous les messages de requête. J'utilise ceci dans quelques-uns de mes clients. Vous pouvez également faire de même du côté des services en implémentant IDispatchMessageInspector .
Est-ce ce que vous aviez en tête?
Mise à jour: j'ai trouvé cette liste de fonctionnalités WCF prises en charge par le framework compact. Je crois que les inspecteurs de messages classés comme «extensibilité des canaux» qui, selon ce post, sont pris en charge par le cadre compact.
la source
OutgoingMessageProperties
sont ce dont vous avez besoin pour accéder aux en-têtes HTTP - pasOutgoingMessageHeaders
qui sont des en-têtes SOAP.Vous l'ajoutez à l'appel en utilisant:
Et puis, côté serveur, vous le récupérez en utilisant:
la source
OperationContextScope
(etOperationContext
) sontThreadStatic
- la réponse de Mark Good fonctionnera sans compter sur desThreadStatic
éléments.Si vous souhaitez simplement ajouter le même en-tête à toutes les demandes du service, vous pouvez le faire sans aucun codage!
Ajoutez simplement le nœud d'en-têtes avec les en-têtes requis sous le nœud de point de terminaison dans votre fichier de configuration client
la source
MessageHeader
) et non des en-têtes HTTP.Voici une autre solution utile pour ajouter manuellement des en-têtes HTTP personnalisés à votre demande WCF client en utilisant le
ChannelFactory
comme proxy. Cela devrait être fait pour chaque requête, mais cela suffit comme une simple démonstration si vous avez juste besoin de tester unitaire votre proxy en préparation pour les plates-formes non.NET.la source
Ceci est similaire à la réponse NimsDotNet mais montre comment le faire par programme.
Ajoutez simplement l'en-tête à la reliure
la source
la source
C'est ce qui a fonctionné pour moi, adapté de l' ajout d'en-têtes HTTP aux appels WCF
Après avoir déclaré ces classes, vous pouvez ajouter le nouveau comportement à votre client WCF comme ceci:
la source
Cela fonctionne pour moi
la source
Les liaisons de contexte dans .NET 3.5 peuvent être exactement ce que vous recherchez. Il y en a trois prêts à l'emploi: BasicHttpContextBinding, NetTcpContextBinding et WSHttpContextBinding. Le protocole de contexte transmet essentiellement des paires clé-valeur dans l'en-tête du message. Consultez l'article Managing State With Durable Services sur le magazine MSDN.
la source
Si je comprends bien votre exigence, la réponse simple est: vous ne pouvez pas.
En effet, le client du service WCF peut être généré par tout tiers qui utilise votre service.
SI vous avez le contrôle des clients de votre service, vous pouvez créer une classe client de base qui ajoute l'en-tête souhaité et hérite du comportement sur les classes de travail.
la source
Vous pouvez spécifier des en-têtes personnalisés dans MessageContract .
Vous pouvez également utiliser des en - têtes <endpoint> qui sont stockés dans le fichier de configuration et qui seront copiés dans l'en-tête de tous les messages envoyés par le client / service. Ceci est utile pour ajouter facilement un en-tête statique.
la source
MessageHeader
) et non des en-têtes HTTP.Si vous souhaitez ajouter des en-têtes HTTP personnalisés à chaque appel WCF d'une manière orientée objet, ne cherchez pas plus loin.
Tout comme dans la réponse de Mark Good et paulwhit, nous devons créer une sous-classe
IClientMessageInspector
pour injecter les en-têtes HTTP personnalisés dans la requête WCF. Cependant, rendons l'inspecteur plus générique en acceptant un dictionnaire contenant les en-têtes que nous voulons ajouter:Tout comme dans la réponse de Mark Good et paulwhit, nous devons créer une sous-classe
IEndpointBehavior
pour l'injecterHttpHeaderMessageInspector
dans notre client WCF.La dernière partie nécessaire pour terminer notre approche orientée objet consiste à créer une sous-classe de notre client généré automatiquement WCF (j'ai utilisé le guide de référence du service Web WCF de Microsoft pour générer un client WCF).
Dans mon cas, je dois attacher une clé API à l'en-
x-api-key
tête HTML.La sous-classe effectue les opérations suivantes:
EndpointConfiguration
énumération a été générée pour passer au constructeur - peut-être que votre implémentation ne l'aura pas)AddHttpHeaderMessageEndpointBehavior
auxEndpoint
comportements du clientEnfin, utilisez votre client!
La requête HTTP résultante doit contenir vos en-têtes HTTP et ressembler à ceci:
la source
Un peu tard à la fête mais Juval Lowy aborde ce scénario exact dans son livre et le ServiceModelEx associé bibliothèque .
Fondamentalement, il définit les spécialisations ClientBase et ChannelFactory qui permettent de spécifier des valeurs d'en-tête de type sécurisé. Je suggère de télécharger la source et de regarder les classes HeaderClientBase et HeaderChannelFactory.
John
la source