InstanceContext qui pose des problème
:salut:
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:
Code:
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 service:
Code:
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 |
Mon client:
Code:
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 |
et enfin mes fichier config
Host:
Code:
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> |
et client:
Code:
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> |
j'ai surement mal placé une partie du code, mais je n'arrive pas à savoir laquelle :cry: