j'essaie de mettre en place un wcf en duplex à partir d'exemples simples.
Mon service est bien lancé sur mon host, mais lorsque j'essaie de le lancer depuis mon client, j'ai une erreur au niv"eau de la creation du channel. Il m'indique que la fonction callback n'est pas implémentée.
Mon interface:
Mon service:
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 Imports System.ServiceModel <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required, CallbackContract:=GetType(ICalculatorDuplexCallback))> _ Public Interface ICalculatorDuplex <OperationContract(IsOneWay:=True)> _ Sub Clear() <OperationContract(IsOneWay:=True)> _ Sub AddTo(ByVal n As Double) <OperationContract(IsOneWay:=True)> _ Sub SubtractFrom(ByVal n As Double) <OperationContract(IsOneWay:=True)> _ Sub MultiplyBy(ByVal n As Double) <OperationContract(IsOneWay:=True)> _ Sub DivideBy(ByVal n As Double) End Interface Public Interface ICalculatorDuplexCallback <OperationContract(IsOneWay:=True)> _ Sub Equals(ByVal result As Double) <OperationContract(IsOneWay:=True)> _ Sub Equation(ByVal eqn As String) End Interface
Mon client:
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 Option Explicit On Imports System.Data.Odbc Imports System.Collections.Generic Imports System.Threading Imports System.ServiceModel Imports DevInterface Public Class CalculatorService Implements ICalculatorDuplex Private result As Double = 0.0R Private equation As String Public Sub New() equation = result.ToString() End Sub Public Sub Clear() Implements ICalculatorDuplex.Clear Callback.Equation(equation & " = " & result.ToString()) equation = result.ToString() End Sub Public Sub AddTo(ByVal n As Double) Implements ICalculatorDuplex.AddTo result += n equation &= " + " & n.ToString() CType(Callback, Object).Equals(result) End Sub Public Sub SubtractFrom(ByVal n As Double) Implements ICalculatorDuplex.SubtractFrom result -= n equation &= " - " & n.ToString() CType(Callback, Object).Equals(result) End Sub Public Sub MultiplyBy(ByVal n As Double) Implements ICalculatorDuplex.MultiplyBy result *= n equation &= " * " & n.ToString() CType(Callback, Object).Equals(result) End Sub Public Sub DivideBy(ByVal n As Double) Implements ICalculatorDuplex.DivideBy result /= n equation &= " / " & n.ToString() CType(Callback, Object).Equals(result) End Sub Private ReadOnly Property Callback() As ICalculatorDuplexCallback Get Return OperationContext.Current.GetCallbackChannel(Of ICalculatorDuplexCallback)() End Get End Property End Class
et enfin mes fichier 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
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 Option Explicit On Option Strict On Imports System.ServiceModel Imports System.ServiceModel.Channels Imports DevInterface <ServiceBehavior(InstanceContextMode:=ServiceModel.InstanceContextMode.PerSession)> _ Public Class ClientForm Private Sub btConvert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btconvert.Click Dim myChannelFactory As ServiceModel.ChannelFactory(Of DevInterface.ICalculatorDuplex) = Nothing Dim myService As DevInterface.ICalculatorDuplex 'Construct InstanceContext to handle messages on callback interface ' Construct InstanceContext to handle messages on callback interface Dim instanceContext As New InstanceContext(New CallbackHandler()) 'Try 'myChannelFactory = New ServiceModel.ChannelFactory(Of DevInterface.IServiceDev)("ConfigurationHttpCurrency") 'myService = myChannelFactory.CreateChannel() myChannelFactory = New ServiceModel.DuplexChannelFactory(Of DevInterface.ICalculatorDuplex)("ConfigurationHttpCurrency") myChannelFactory.Endpoint.Address = New EndpointAddress("http://localhost:8018/CurrencyService") myService = myChannelFactory.CreateChannel() ' Call the AddTo service operation. Dim value As Double = 100 myService.Clear() myService.AddTo(value) ' Call the SubtractFrom service operation. value = 50 myService.DivideBy(value) ' Call the MultiplyBy service operation. value = 17 myService.MultiplyBy(value) ' Call the DivideBy service operation. value = 2 myService.SubtractFrom(value) End Sub End Class Public Class CallbackHandler Implements ICalculatorDuplexCallback Public Overridable Shadows Sub Equals(ByVal result As Double) Implements ICalculatorDuplexCallback.Equals Console.WriteLine("Equals({0})", result) End Sub Public Sub Equation(ByVal eqn As String) Implements ICalculatorDuplexCallback.Equation Console.WriteLine("Equation({0})", eqn) End Sub End Class
Host:
et client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="DevService.CalculatorService"> <endpoint address="http://localhost:8018/CurrencyService" binding="wsDualHttpBinding" contract="DevInterface.ICalculatorDuplex" /> </service> </services> </system.serviceModel> </configuration>
j'ai surement mal placé une partie du code, mais je n'arrive pas à savoir laquelle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address="http://localhost:8018/CurrencyService" binding="wsDualHttpBinding" contract="DevInterface.ICalculatorDuplex" name="ConfigurationHttpCurrency" /> </client> </system.serviceModel> </configuration>
Partager