Bonjour,

Je viens de traduire le chat http://badger.developpez.com/tutorie...atez-avec-WCF/ en VB.NET

Ca a l'air de marcher, mes clients se connectent bien au channel et l'hote les affiche correctement mais les messages ne sont pas transmis. Chaque client recoit seulement le message qu'il envoie, de la meme facon, les messages qui disent qu'un nouveau client est connecté ne passent pas. Est ce que quelqu un a deja eu ce probleme ?

Voici mon code pour ChatWCF.vb

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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
 
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
 
Imports System.ServiceModel
Imports System.Threading
Imports ChatContracts
 
Namespace ChatServices
 
    <ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerSession, ConcurrencyMode:=ConcurrencyMode.Single)> Public Class ChatWCF
        Implements IChatWCF
 
        Event ChatMessageEvent As ChatMessageEventHandler
        Delegate Sub ChatMessageEventHandler(ByVal sender As Object, ByVal e As ChatMessageEventArgs)
 
        Event ConnexionEvent As ConnexionEventHandler
        Delegate Sub ConnexionEventHandler(ByVal sender As Object, ByVal e As ConnexionEventArgs)
 
        Event DeconnexionEvent As DeconnexionEventHandler
        Delegate Sub DeconnexionEventHandler(ByVal sender As Object, ByVal e As DeconnexionEventArgs)
 
        'pour rappeler le client
        Private callback As IChatWCFRappel = Nothing
 
        'pseudo de l'utilisateur
        Private pseudoUtilisateur As String = Nothing
 
        'liste des utilisateurs connectés
        Dim listeUtilisateurs As List(Of String) = New List(Of String)
 
        Public Sub DemarrerSession(ByVal pseudo As String) Implements IChatWCF.DemarrerSession
 
            Console.WriteLine("User " & pseudo & " is attempting to connect")
            callback = OperationContext.Current.GetCallbackChannel(Of IChatWCFRappel)()
            pseudoUtilisateur = pseudo
 
            SyncLock (listeUtilisateurs)
 
                listeUtilisateurs.Add(pseudo)
 
                AddHandler ChatMessageEvent, AddressOf ChatMessageHandler 'on s'abonne à la réception de nouveaux messages
                AddHandler ConnexionEvent, AddressOf ConnexionHandler 'on s'abonne à la connexion de nouveaux utilisateurs
                AddHandler DeconnexionEvent, AddressOf DeconnexionHandler 'on s'abonne à la déconnexion d'utilisateurs
                Dim cea As ConnexionEventArgs = New ConnexionEventArgs() 'on informe les utilisateurs de la connexion d'un nouveau venu
                cea.Utilisateur = Me.pseudoUtilisateur
                RaiseEvent ConnexionEvent(Me, cea)
                AddHandler OperationContext.Current.Channel.Closing, AddressOf Channel_Closing
 
                Console.WriteLine("User {0} is connected", pseudoUtilisateur)
            End SyncLock
        End Sub
 
        '//le client ferme le canal
        Private Sub Channel_Closing(ByVal sender As Object, ByVal e As EventArgs)
 
            Console.WriteLine("{0} closed channel", pseudoUtilisateur)
            ' //si on n'est pas passé par FermerSession avant
            SyncLock (listeUtilisateurs)
 
                If listeUtilisateurs.Contains(Me.pseudoUtilisateur) Then
                    FermerSession()
                End If
            End SyncLock
        End Sub
 
        Public Sub FermerSession() Implements IChatWCF.FermerSession
 
            SyncLock (listeUtilisateurs)
 
                ' //on désabonne le client
                RemoveHandler ChatMessageEvent, AddressOf ChatMessageHandler
                RemoveHandler ConnexionEvent, AddressOf ConnexionHandler
                RemoveHandler DeconnexionEvent, AddressOf DeconnexionHandler
 
                listeUtilisateurs.Remove(Me.pseudoUtilisateur)
            End SyncLock
 
            '  //on informe les utilisateurs de la déconnexion 
            Dim dea As DeconnexionEventArgs = New DeconnexionEventArgs()
            dea.Utilisateur = Me.pseudoUtilisateur
 
            Try
                RaiseEvent DeconnexionEvent(Me, dea)
            Catch ex As Exception
 
            End Try
 
 
 
            Console.WriteLine("User {0} is disconnected", Me.pseudoUtilisateur)
        End Sub
 
 
 
        Public Sub EnvoyerMessage(ByVal message As String) Implements IChatWCF.EnvoyerMessage
 
            'on informe les utilisateurs d'un nouveau message
            Dim mea As ChatMessageEventArgs = New ChatMessageEventArgs()
            mea.Message = message '//le message
            mea.Utilisateur = Me.pseudoUtilisateur '//l'expéditeur
            RaiseEvent ChatMessageEvent(Me, mea)
            Console.WriteLine(mea.Utilisateur & ":" & mea.Message)
        End Sub
 
        Public Sub Test() Implements IChatWCF.test
            Console.WriteLine("Test")
        End Sub
 
        'méthode appelée quand l'évènement ChatMessageEvent est déclanché
        Private Sub ChatMessageHandler(ByVal sender As Object, ByVal e As ChatMessageEventArgs) ' Handles Me.ChatMessageEvent
            callback.ReceptionMessage(e.Utilisateur, e.Message)
        End Sub
 
        'méthode appelée quand l'évènement DeconnexionEvent est déclanché
        Private Sub DeconnexionHandler(ByVal sender As Object, ByVal e As DeconnexionEventArgs) ' Handles Me.DeconnexionEvent
 
            callback.deconnexionUtilisateur(e.Utilisateur)
        End Sub
 
        'méthode appelée quand l'évènement ConnexionEvent est déclanché
        Private Sub ConnexionHandler(ByVal sender As Object, ByVal e As ConnexionEventArgs) ' Handles Me.ConnexionEvent
            callback.connexionUtilisateur(e.Utilisateur)
        End Sub
 
        Class ChatMessageEventArgs
            Inherits EventArgs
 
            Private _message As String
            Private _utilisateur As String
 
            Public Property Message() As String
                Get
                    Return _message
                End Get
                Set(ByVal Value As String)
                    _message = Value
                End Set
            End Property
            Public Property Utilisateur() As String
                Get
                    Return _utilisateur
                End Get
                Set(ByVal Value As String)
                    _utilisateur = Value
                End Set
            End Property
        End Class
 
        Class DeconnexionEventArgs
            Inherits EventArgs
 
            Private _utilisateur As String
            Public Property Utilisateur() As String
                Get
                    Return _utilisateur
                End Get
                Set(ByVal Value As String)
                    _utilisateur = Value
                End Set
            End Property
        End Class
 
        Class ConnexionEventArgs
            Inherits EventArgs
            Private _utilisateur As String
            Public Property Utilisateur() As String
                Get
                    Return _utilisateur
                End Get
                Set(ByVal Value As String)
                    _utilisateur = Value
                End Set
            End Property
        End Class
 
    End Class
End Namespace