IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

InstanceContext qui pose des problème


Sujet :

Windows Communication Foundation .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut InstanceContext qui pose des problème


    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 : 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 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
    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 : 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
    et enfin mes fichier config
    Host:
    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>
    et client:
    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>
    j'ai surement mal placé une partie du code, mais je n'arrive pas à savoir laquelle
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Je dis peut-être une connerie mais ton ClientForm
    ne doit-il pas implémenter l'interface ICalculatorDuplexCallback?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClientForm Implements ICalculatorDuplexCallback

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Hum, meme en implémentant le callback dans la classe client, je passerai donc par InstanceContext(Me)
    ca me donne ce code la:
    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
    Imports System.ServiceModel.Channels
    Imports DevInterface
    <ServiceBehavior(InstanceContextMode:=ServiceModel.InstanceContextMode.PerSession)> _
    Public Class ClientForm
        Implements ICalculatorDuplexCallback
        Public Overridable Shadows Sub Equals(ByVal result As Double) Implements ICalculatorDuplexCallback.Equals
            Me.lblResult.Text = result.ToString
        End Sub
     
        Public Sub Equation(ByVal eqn As String) Implements ICalculatorDuplexCallback.Equation
            Me.lblResult.Text = eqn.ToString
        End Sub
     
        Private Sub btConvert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btconvert.Click
     
            Dim myChannelFactory As DuplexChannelFactory(Of ICalculatorDuplex) =  Nothing
            myChannelFactory = New ServiceModel.DuplexChannelFactory(Of DevInterface.ICalculatorDuplex)("ConfigurationHttpCurrency")
            myChannelFactory.Endpoint.Address = New EndpointAddress("http://localhost:8018/CurrencyService")
            'Create a channel.
            Dim myService As DevInterface.ICalculatorDuplex
            Dim instanceContext As New InstanceContext(Me)
            myservice = myChannelFactory.CreateChannel()
     
            myService = myChannelFactory.CreateChannel()
            myService.Clear()
            myService.AddTo(100)
            myService.DivideBy(5)
            myService.SubtractFrom(8)
        End Sub
    End Class
    mais j'ai le droit au meme message
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Ca <ServiceBehavior(InstanceContextMode:=ServiceModel.InstanceContextMode.PerSession)> _

    Ca sert a rien du coté client


    et ca plante tjs au myChannelFactory = New ServiceModel.DuplexChannelFactory(Of DevInterface.ICalculatorDuplex)("ConfigurationHttpCurrency")?
    avec le meme message?

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    ok, le servicebehavior se déclare seulement dans la partie Service, evidemment

    Toujours la meme erreur par contre.
    j'ai recréé une classe dédiée pour le callback
    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
    Dim myChannelFactory As DuplexChannelFactory(Of ICalculatorDuplex) = Nothing
            myChannelFactory = New ServiceModel.DuplexChannelFactory(Of DevInterface.ICalculatorDuplex)("ConfigurationHttpCurrency")
            myChannelFactory.Endpoint.Address = New EndpointAddress("http://localhost:8018/CurrencyService")
            'Create a channel.
            Dim myService As DevInterface.ICalculatorDuplex
            Dim instanceContext As New InstanceContext(New CallbackHandler())
     
     
            myService = myChannelFactory.CreateChannel()
            myService.Clear()
            myService.AddTo(100)
            Thread.Sleep(2000)
     
            myService.DivideBy(5)
            Thread.Sleep(2000)
     
            myService.SubtractFrom(8)
        End Sub

    Si quelqu'un a un projet simple avec juste l'host et le client qui communique, je peux adapter dans la foulée
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Ici mais c'est en C# (VB.net c'est mal )

    mais il y a des convertisseurs sur le net pour le traduire en VB.Net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete somme qui pose des problèmes
    Par Shakallica dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 20/04/2013, 22h10
  2. Globales variables qui causent des problèmes.
    Par Simonake dans le forum Langage
    Réponses: 2
    Dernier message: 22/10/2009, 09h38
  3. windows defender me pose des problémes
    Par lalouvesijetattrape dans le forum Windows Vista
    Réponses: 4
    Dernier message: 30/06/2008, 10h03
  4. [FreeBSD] pkgdb -F pose des problèmes
    Par piouPiouM dans le forum BSD
    Réponses: 4
    Dernier message: 22/03/2005, 12h15
  5. RegCreateKeyEx me pose des problèmes sous XP
    Par Morgatte dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 08/07/2004, 05h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo