Au cas où ça serve... J'avais fait un long texte, firefox m'a crashé, je sais même plus où j'en étais donc désolé de faire synthétique du coup :/ .... de longues minutes parties à la poubelle.

Pour faire simple c'est dans l'idée de rajouter des petits bouts dans la faq pour aider à mettre en place des applis servers/clients wcf, j'ai galéré sur des bugs pour ce que je voulais faire, impossible de trouver des réponses, dont un bug qui n'a qu'une réponse sur stackoverflow et la réponse est fausse. Il y a peut être une manière plus simple de faire mais pour ma part je n'ai jamais pu trouver, et j'ose même plus poser de question sur stackoverflow avec le nombre de trolls, ceux qui s'amusent sans avoir compris la question à faire chuter le sujet à coup de -1, etc. Concrètement faut être développeur chevronné ou parfait noob qui ne veut rien chercher par lui même pour ne pas se faire tuer son sujet.





Sujet: Connexion sans appconfig à un server WCF, en mode duplex (Uniquement du code c#).

Vous avez déjà un serveur WCF en place qui vous a fourni des informations de connexion, une interface contenant les méthodes exposées.

L'objet "client" contient les méthodes, délégués, etc en rapport avec les callback. (Les données émises du serveur vers le client auxquelles on s'est abonné)
L'objet "server" contient les méthodes exposées par l'interface du serveur (les méthodes qu'on peut lui dire de faire).

Version simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
            ClientWCF client = new ClientWCF();		// Class qui implémente l'interface fournit par le serveur WCF
            NetNamedPipeBinding binding = new NetNamedPipeBinding();	// Protocole de connexion
            EndpointAddress myEndpoint = new EndpointAddress("net.pipe://localhost/");	// Adresse de connexion donnée par le serveur
 
            DuplexChannelFactory<IService> duplexChannelFactory = new DuplexChannelFactory<IService>(client, binding, myEndpoint) ;
            IService server = duplexChannelFactory.CreateChannel();
Version plus avancée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
            ClientWCF client = new ClientWCF();
 
            InstanceContext ic = new InstanceContext(client);	// bug avec un typeof
            ContractDescription contrat = ContractDescription.GetContract(typeof(IService));
 
            NetNamedPipeBinding binding = new NetNamedPipeBinding();
            EndpointAddress myEndpoint = new EndpointAddress("net.pipe://localhost/");
            ServiceEndpoint sed = new ServiceEndpoint(contrat, binding, myEndpoint) ;
 
            DuplexChannelFactory<IService> duplexChannelFactory = new DuplexChannelFactory<IService>(ic, sed) ;
            IService server = duplexChannelFactory.CreateChannel();
Notes:
  • si vous mettez un 'typeof()' en paramètre de "InstanceContext" vous obtenez le code d'erreur: InvalidOperationException*: InstanceContext fourni à ChannelFactory contient un UserObject qui n'implémente pas CallbackContractType 'Nom_de_domaine.Nom_de_votre_interface_suivie_de_CallBack'.
  • A ce stade, si vous n'avez pas le serveur WCF lancé et que vous envoyez une commande, vous obtiendrez une erreur, pensez par conséquent à wrapper votre commande "client -> server" dans un try/catch, vous pourriez prendre des erreurs inutilement.