Bonjour,
Je veux réaliser une DLL permettant à une application client de communiquer avec les autres clients via P2P. Je suis débutant avec WCF mais j'ai déjà réalisé quelques test de connexions grâce à PNRP qui ont d'ailleurs plutôt bien fonctionnés.
En revanche cette fois je tombe sur un os en voulant créer la librairie qui me permettrait de faire la même chose. J'ai déjà consulté beaucoup de codes de chats P2P ou client/serveur utilisant WCF mais je n'arrive pas à résoudre mon problème.
Voici le diagramme des classes de ce que j'ai déjà mis en place :
Je veux donc réaliser une librairie qui me permettrait d'instancier un IClientChannel et d'implementer les méthodes interagissant avec l'interface utilisateur.
Interface du service :
Interface des callbacks :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 [ServiceContract(CallbackContract = typeof(ISocketCallback))] interface ISocketContract { // Méthodes } interface ISocketChannel : ISocketContract, IClientChannel { }
En fait mon soucis apparaît au demarrage du channel. En effet un exception est levée dans ma méthode de connection avec le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 [ServiceContract] public interface ISocketCallback { // Méthodes }
Méthode de connection de la classe d'implementation de l'interface du service :InstanceContext fourni à ChannelFactory contient un UserObject qui n’implémente pas CallbackContractType « TTO_Socket.ISocketCallback ».
Alors je me suis logiquement dit que le problème provenait soit d'une erreur de conception soit d'une erreur de config dans mon fichier App.config
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public void Connect() { serviceContext = new InstanceContext(this); serviceBinding = new NetPeerTcpBinding("TTO_Net_Binding"); serviceChannelFactory = new DuplexChannelFactory<ISocketChannel>(serviceContext, "TTO_Net_Endpoint"); serviceChannel = serviceChannelFactory.CreateChannel(); serviceStatusHandler = serviceChannel.GetProperty<IOnlineStatus>(); serviceStatusHandler.Online += new EventHandler(OnOnline); serviceStatusHandler.Offline += new EventHandler(OnOffline); serviceChannel.InitializeConnection(); }
App.config de l'appli hote :
Et enfin le code de l'appli hote :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint name="TTO_Net_Endpoint" address="net.p2p://TTO_Socket/TTO_UI" binding="netPeerTcpBinding" bindingConfiguration="TTO_Net_Binding" contract="TTO_Socket.ISocketContract"> </endpoint> </client> <bindings> <netPeerTcpBinding> <binding name="TTO_Net_Binding" port="0"> <resolver mode="Auto"/> <security mode="None"/> </binding> </netPeerTcpBinding> </bindings> </system.serviceModel> </configuration>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public partial class TTO_Window : ISocketCallback { SocketService mysocket; public TTO_Window() { this.InitializeComponent(); mysocket = new SocketService(); } // Implémentation des callbacks private void Button_Click(object sender, RoutedEventArgs e) { mysocket.Connect(); } }
Désolé si j'ai du autant mettre de citation de code mais je dois avouer que je suis un peu derouté et surtout je commence à douter que ma méthode de conception de bibliothèque soit la bonne. C'est pour cela que je viens vous demander conseil.
Merci d'avance.
Lionel.
Partager