[WCF] Insertions d’entêtes HTTP avec un ChannelFactory

Publié le 26 mars 2009 par Jeremy.jeanson

il y a quelques jours j’ai posté un code similaire pour intégrer des données dans l’entête HTTP d’un requête  sur un service WCF. Mon exemple était batti sur un proxy généré via Visual Sudio, voici un code permetant d’effectuer la même opération via un proxy créé manulellement via ChannelFactory.

Vb

' Création du binding
Dim binding As new BasicHttpBinding()

' Création du point de terminaison du service
Dim endPoint As new EndpointAddress("http://localhost:50000/MonService.svc")

' Création de la foctory qui va fabriquer le canal de communication
Dim factory As new ChannelFactory(Of IServiceUtilisateurs)( _
	binding, _
    endPoint)

' Création du canal et retour de l'interface du service
Dim proxy As IServiceUtilisateurs = factory.CreateChannel()

Dim channel As IClientChannel = CType(proxy,IClientChannel)
                
' Création du scope sur le service pour ajout d'entêtes HTTP
Dim scope As new OperationContextScope(CType(proxy,IClientChannel))
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader( _
	"Nom1", _
    String.Empty, _
	"Valeur1"))

OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader( _
	"Nom2", _
    String.Empty, _
	"Valeur2"))

' ...etc...

C#

// Création du binding
BasicHttpBinding binding = new BasicHttpBinding();

// Création du point de terminaison du service
EndpointAddress endPoint =new EndpointAddress("http://localhost:50000/MonService.svc");

// Création de la foctory qui va fabriquer le canal de communication
ChannelFactory<IServiceUtilisateurs> factory = new ChannelFactory<IServiceUtilisateurs>(
	binding,
    endPoint);

// Création du canal et retour de l'interface du service
IServiceUtilisateurs proxy = factory.CreateChannel();

IClientChannel channel = (IClientChannel)proxy;
                
// Création du scope sur le service pour ajout d'entêtes HTTP
OperationContextScope scope = new OperationContextScope((IClientChannel)proxy );
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader(
	"Nom1",
    String.Empty,
	"Valeur1"));

OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader(
	"Nom2",
    String.Empty,
	"Valeur2"));

// ...etc...

Comme vous le voyez ici l’astuce consiste à faire un cast du proxy en IClientChannel. Plutôt facile, mais encore fallait il y penser.