Comment : établir une liaison à un service Web à l’aide du BindingSource Windows Forms

Si vous voulez lier un contrôle Windows Forms aux résultats obtenus à partir d'un appel à un service web XML, vous pouvez utiliser un composant BindingSource. Cette procédure est similaire à celle d'une liaison d'un composant BindingSource à un type. Vous devez créer un proxy côté client qui contienne les méthodes et les types exposés par le service web. Vous générez un proxy côté client à partir du service web (.asmx) lui-même ou à partir de son fichier WSDL. En outre, votre proxy côté client doit exposer les champs de types complexes utilisés par le service web en tant que propriétés publiques. Vous pouvez ensuite lier la BindingSource à l'un des types exposés dans le proxy du service web.

Pour créer un proxy côté client et créer des liaisons à celui-ci

  1. Créez un formulaire Windows dans le répertoire de votre choix, avec un espace de noms approprié.

  2. Ajoutez un composant BindingSource au formulaire.

  3. Ouvrez l’invite de commandes du Kit de développement logiciel (SDK) Windows, puis accédez au même répertoire dans lequel se trouve votre formulaire.

  4. À l’aide de l’outil WSDL, entrez wsdl et l’URL du fichier .asmx ou WSDL du service web, suivi de l’espace de noms de votre application, et éventuellement le langage utilisé.

    L’exemple de code suivant utilise le service Web situé à l’adresse http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx. Par exemple, pour un type C# wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService ou pour un type Visual Basic wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService /language:VB. Le fait de passer le chemin d’accès en tant qu’argument à l’outil WSDL génère un proxy côté client dans le même répertoire et le même espace de noms que votre application, dans le langage spécifié. Si vous utilisez Visual Studio, ajoutez le fichier à votre projet.

  5. Sélectionnez un type dans le proxy côté client avec lequel créer une liaison.

    Il s'agit généralement d'un type retourné par une méthode fournie par le service web. Les champs du type choisi doivent être exposés en tant que propriétés publiques pour la liaison.

        [System::SerializableAttribute, System::Xml::Serialization::XmlTypeAttribute(
            Namespace="http://webservices.eraserver.net/")]
        public ref class USPSAddress
        {
    
    private:
            String^ streetField;
    
            String^ cityField;
    
            String^ stateField;
    
            String^ shortZIPField;
    
            String^ fullZIPField;
    
    
    public:
            property String^ Street    
            {
                String^ get()
                {
                    return this->streetField;
                }
                void set( String^ value )
                {
                    this->streetField = value;
                }
            }
    
    
            property String^ City    
            {
                String^ get()
                {
                    return this->cityField;
                }
                void set( String^ value )
                {
                    this->cityField = value;
                }
            }
            property String^ State    
            {
                String^ get()
                {
                    return this->stateField;
                }
                void set( String^ value )
                {
                    this->stateField = value;
                }
            }
    
            property String^ ShortZIP    
            {
                String^ get()
                {
                    return this->shortZIPField;
                }
                void set( String^ value )
                {
                    this->shortZIPField = value;
                }
            }
    
            property String^ FullZIP    
            {
                String^ get()
                {
                    return this->fullZIPField;
                }
                void set( String^ value )
                {
                    this->fullZIPField = value;
                }
            }
        };
    
    [System.SerializableAttribute, System.Xml.Serialization.XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public class USPSAddress
    {
    
        private string streetField;
    
        private string cityField;
    
        private string stateField;
    
        private string shortZIPField;
    
        private string fullZIPField;
    
        public string Street
        {
            get
            {
                return this.streetField;
            }
            set
            {
                this.streetField = value;
            }
        }
    
        public string City
        {
            get
            {
                return this.cityField;
            }
            set
            {
                this.cityField = value;
            }
        }
    
        public string State
        {
            get
            {
                return this.stateField;
            }
            set
            {
                this.stateField = value;
            }
        }
    
        public string ShortZIP
        {
            get
            {
                return this.shortZIPField;
            }
            set
            {
                this.shortZIPField = value;
            }
        }
    
        public string FullZIP
        {
            get
            {
                return this.fullZIPField;
            }
            set
            {
                this.fullZIPField = value;
            }
        }
    }
    
    <System.SerializableAttribute(), _
     System.Xml.Serialization.XmlTypeAttribute( _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class USPSAddress
    
        Private streetField As String
    
        Private cityField As String
    
        Private stateField As String
    
        Private shortZIPField As String
    
        Private fullZIPField As String
    
    
        Public Property Street() As String
            Get
                Return Me.streetField
            End Get
            Set(ByVal value As String)
                Me.streetField = value
            End Set
        End Property
    
    
        Public Property City() As String
            Get
                Return Me.cityField
            End Get
            Set(ByVal value As String)
                Me.cityField = value
            End Set
        End Property
    
        Public Property State() As String
            Get
                Return Me.stateField
            End Get
            Set(ByVal value As String)
                Me.stateField = value
            End Set
        End Property
    
    
        Public Property ShortZIP() As String
            Get
                Return Me.shortZIPField
            End Get
            Set(ByVal value As String)
                Me.shortZIPField = value
            End Set
        End Property
    
    
        Public Property FullZIP() As String
            Get
                Return Me.fullZIPField
            End Get
            Set(ByVal value As String)
                Me.fullZIPField = value
            End Set
        End Property
    End Class
    
  6. Définissez la propriété DataSource de BindingSource sur le type contenu dans le proxy côté client du service web.

    BindingSource1->DataSource = USPSAddress::typeid;
    
    BindingSource1.DataSource = typeof(USPSAddress);
    
    BindingSource1.DataSource = GetType(USPSAddress)
    

Pour lier des contrôles à une BindingSource liée à un service web

  • Liez des contrôles à BindingSource, en passant la propriété publique du type de service web de votre choix en tant que paramètre.

    textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
    
    textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
    
    textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
    

Exemple

L'exemple de code suivant montre comment lier un composant BindingSource à un service web, puis comment lier une zone de texte au composant BindingSource. Quand vous cliquez sur le bouton, une méthode de service web est appelée et les résultats s'affichent dans textbox1.

#using <System.Windows.Forms.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Web.Services.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Collections::Generic;
using namespace System::ComponentModel;
using namespace System::Drawing;
using namespace System::Windows::Forms;
 
namespace BindToWebService {

    [System::SerializableAttribute, System::Xml::Serialization::XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public ref class USPSAddress
    {

private:
        String^ streetField;

        String^ cityField;

        String^ stateField;

        String^ shortZIPField;

        String^ fullZIPField;


public:
        property String^ Street    
        {
            String^ get()
            {
                return this->streetField;
            }
            void set( String^ value )
            {
                this->streetField = value;
            }
        }


        property String^ City    
        {
            String^ get()
            {
                return this->cityField;
            }
            void set( String^ value )
            {
                this->cityField = value;
            }
        }
        property String^ State    
        {
            String^ get()
            {
                return this->stateField;
            }
            void set( String^ value )
            {
                this->stateField = value;
            }
        }

        property String^ ShortZIP    
        {
            String^ get()
            {
                return this->shortZIPField;
            }
            void set( String^ value )
            {
                this->shortZIPField = value;
            }
        }

        property String^ FullZIP    
        {
            String^ get()
            {
                return this->fullZIPField;
            }
            void set( String^ value )
            {
                this->fullZIPField = value;
            }
        }
    };


    [System::Web::Services::WebServiceBindingAttribute(Name="ZipCodeResolverSoap",
        Namespace="http://webservices.eraserver.net/")]
    public ref class ZipCodeResolver:
        public System::Web::Services::Protocols::SoapHttpClientProtocol

    {
        
public:
        ZipCodeResolver() : SoapHttpClientProtocol()
        {        
            this->Url = 
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx";
        }

    
        //''<remarks/>
        [System::Web::Services::Protocols::SoapDocumentMethodAttribute
            ("http://webservices.eraserver.net/CorrectedAddressXml", 
            RequestNamespace="http://webservices.eraserver.net/", 
            ResponseNamespace="http://webservices.eraserver.net/", 
            Use=System::Web::Services::Description::SoapBindingUse::Literal, 
            ParameterStyle=System::Web::Services::Protocols::SoapParameterStyle::Wrapped)]
        USPSAddress^ CorrectedAddressXml(String^ accessCode, 
            String^ address, String^ city, String^ state)
        {
            array<Object^>^ results = this->Invoke("CorrectedAddressXml", 
                gcnew array<Object^>{accessCode, address, city, state});
            return ((USPSAddress^) results[0]);
        }

        //''<remarks/>
        System::IAsyncResult^ BeginCorrectedAddressXml(String^ accessCode,
            String^ address, String^ city, String^ state, 
            System::AsyncCallback^ callback, Object^ asyncState)
        {

            return this->BeginInvoke("CorrectedAddressXml", 
                gcnew array<Object^>{accessCode, address, city, state}, callback, asyncState);
        }


        USPSAddress^ EndCorrectedAddressXml(System::IAsyncResult^ asyncResult)
        {
            array<Object^>^ results = this->EndInvoke(asyncResult);
            return ((USPSAddress^) results[0]);
        }

    };

    ref class Form1: public Form
    {
public:
        [STAThread]
        static void Main()
        {
            Application::EnableVisualStyles();
            Application::Run(gcnew Form1());
        }

private:
        BindingSource^ BindingSource1;

        TextBox^ textBox1;

        TextBox^ textBox2;

        Button^ button1;


public:
        Form1()
        {
            this->Load += gcnew EventHandler(this, &Form1::Form1_Load);
            textBox1->Location = System::Drawing::Point(118, 131);
            textBox1->ReadOnly = true;
            button1->Location = System::Drawing::Point(133, 60);
            button1->Click += gcnew EventHandler(this, &Form1::button1_Click);
            button1->Text = "Get zipcode";
            ClientSize = System::Drawing::Size(292, 266);
            Controls->Add(this->button1);
            Controls->Add(this->textBox1);
                        BindingSource1 = gcnew BindingSource();
                        textBox1 = gcnew TextBox();
                        textBox2 = gcnew TextBox();
                        button1 = gcnew Button();
        }

private:
        void button1_Click(Object^ sender, EventArgs^ e)
        {
            textBox1->Text = "Calling Web service..";
            ZipCodeResolver^ resolver = gcnew ZipCodeResolver();
            BindingSource1->Add(resolver->CorrectedAddressXml("0",
                    "One Microsoft Way", "Redmond", "WA"));
                        
        }

public:
        void Form1_Load(Object^ sender, EventArgs^ e)
        {
            BindingSource1->DataSource = USPSAddress::typeid;
            textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
        }
    };




    public ref class CorrectedAddressXmlCompletedEventArgs:
    public System::ComponentModel::AsyncCompletedEventArgs

    {
private:
        array<Object^>^ results;

internal:
        CorrectedAddressXmlCompletedEventArgs(array<Object^>^ results,
            System::Exception^ exception, bool cancelled, Object^ userState) :
            AsyncCompletedEventArgs(exception, cancelled, userState)
        {        
            this->results = results;
        }


public:
        property USPSAddress^ Result    
        {
            USPSAddress^ get()
            {
                this->RaiseExceptionIfNecessary();
                return ((USPSAddress^) this->results[0]);
            }
        }

     delegate void CorrectedAddressXmlCompletedEventHandler(Object^ sender,
        CorrectedAddressXmlCompletedEventArgs^ args);

    };
}

int main()
{
    BindToWebService::Form1::Main();
    return 1;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace BindToWebService {
    class Form1: Form

    {
        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

        private BindingSource BindingSource1 = new BindingSource();
        private TextBox textBox1 = new TextBox();
        private TextBox textBox2 = new TextBox();
        private Button button1 = new Button();

        public Form1()
        {
            this.Load += new EventHandler(Form1_Load);
            textBox1.Location = new System.Drawing.Point(118, 131);
            textBox1.ReadOnly = true;
            button1.Location = new System.Drawing.Point(133, 60);
            button1.Click += new EventHandler(button1_Click);
            button1.Text = "Get zipcode";
            ClientSize = new System.Drawing.Size(292, 266);
            Controls.Add(this.button1);
            Controls.Add(this.textBox1);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            textBox1.Text = "Calling Web service..";
            ZipCodeResolver resolver = new ZipCodeResolver();
            BindingSource1.Add(resolver.CorrectedAddressXml("0",
                    "One Microsoft Way", "Redmond", "WA"));
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            BindingSource1.DataSource = typeof(USPSAddress);
            textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
        }
    }

    [System.Web.Services.WebServiceBindingAttribute(Name="ZipCodeResolverSoap",
        Namespace="http://webservices.eraserver.net/")]
    public class ZipCodeResolver:
        System.Web.Services.Protocols.SoapHttpClientProtocol

    {
        
        public ZipCodeResolver() : base()
        {
            this.Url =
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx";
        }

        //''<remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute
            ("http://webservices.eraserver.net/CorrectedAddressXml",
            RequestNamespace="http://webservices.eraserver.net/",
            ResponseNamespace="http://webservices.eraserver.net/",
            Use=System.Web.Services.Description.SoapBindingUse.Literal,
            ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        public USPSAddress CorrectedAddressXml(string accessCode,
            string address, string city, string state)
        {
            object[] results = this.Invoke("CorrectedAddressXml",
                new object[]{accessCode, address, city, state});
            return ((USPSAddress) results[0]);
        }

        //''<remarks/>
        public System.IAsyncResult BeginCorrectedAddressXml(string accessCode,
            string address, string city, string state,
            System.AsyncCallback callback, object asyncState)
        {

            return this.BeginInvoke("CorrectedAddressXml",
                new object[]{accessCode, address, city, state}, callback, asyncState);
        }

        public USPSAddress EndCorrectedAddressXml(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((USPSAddress) results[0]);
        }
    }

    [System.SerializableAttribute, System.Xml.Serialization.XmlTypeAttribute(
        Namespace="http://webservices.eraserver.net/")]
    public class USPSAddress
    {

        private string streetField;

        private string cityField;

        private string stateField;

        private string shortZIPField;

        private string fullZIPField;

        public string Street
        {
            get
            {
                return this.streetField;
            }
            set
            {
                this.streetField = value;
            }
        }

        public string City
        {
            get
            {
                return this.cityField;
            }
            set
            {
                this.cityField = value;
            }
        }

        public string State
        {
            get
            {
                return this.stateField;
            }
            set
            {
                this.stateField = value;
            }
        }

        public string ShortZIP
        {
            get
            {
                return this.shortZIPField;
            }
            set
            {
                this.shortZIPField = value;
            }
        }

        public string FullZIP
        {
            get
            {
                return this.fullZIPField;
            }
            set
            {
                this.fullZIPField = value;
            }
        }
    }

    public delegate void CorrectedAddressXmlCompletedEventHandler(object sender,
        CorrectedAddressXmlCompletedEventArgs args);

    public class CorrectedAddressXmlCompletedEventArgs:
    System.ComponentModel.AsyncCompletedEventArgs

    {
        private object[] results;

        internal CorrectedAddressXmlCompletedEventArgs(object[] results,
            System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        public USPSAddress Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((USPSAddress) this.results[0]);
            }
        }
    }
 }
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms

Namespace BindToWebService
    Class Form1
        Inherits Form

        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub

        Private BindingSource1 As New BindingSource()
        Private textBox1 As New TextBox()
        Private textBox2 As New TextBox()
        Private WithEvents button1 As New Button()

        Public Sub New()

            textBox1.Location = New System.Drawing.Point(118, 131)
            textBox1.ReadOnly = True
            button1.Location = New System.Drawing.Point(133, 60)
            button1.Text = "Get zipcode"
            ClientSize = New System.Drawing.Size(292, 266)
            Controls.Add(Me.button1)
            Controls.Add(Me.textBox1)
        End Sub

        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
            Handles button1.Click

            textBox1.Text = "Calling Web service.."
            Dim resolver As New ZipCodeResolver()
            BindingSource1.Add(resolver.CorrectedAddressXml("0", "One Microsoft Way", "Redmond", "WA"))

        End Sub


        Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
            BindingSource1.DataSource = GetType(USPSAddress)
            textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
        End Sub

    End Class

    <System.Diagnostics.DebuggerStepThroughAttribute(), _
     System.ComponentModel.DesignerCategoryAttribute("code"), _
     System.Web.Services.WebServiceBindingAttribute(Name:="ZipCodeResolverSoap", _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class ZipCodeResolver
        Inherits System.Web.Services.Protocols.SoapHttpClientProtocol

        Private CorrectedAddressXmlOperationCompleted As _
            System.Threading.SendOrPostCallback


        Public Sub New()
            MyBase.New()
            Me.Url = _
                "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx"
        End Sub


        Public Event CorrectedAddressXmlCompleted As _
            CorrectedAddressXmlCompletedEventHandler

        <System.Web.Services.Protocols.SoapDocumentMethodAttribute( _
            "http://webservices.eraserver.net/CorrectedAddressXml", _
            RequestNamespace:="http://webservices.eraserver.net/", _
            ResponseNamespace:="http://webservices.eraserver.net/", _
            Use:=System.Web.Services.Description.SoapBindingUse.Literal, _
            ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)> _
        Public Function CorrectedAddressXml(ByVal accessCode As String, _
            ByVal address As String, ByVal city As String, ByVal state As String) _
            As USPSAddress
            Dim results() As Object = Me.Invoke("CorrectedAddressXml", _
                New Object() {accessCode, address, city, state})
            Return CType(results(0), USPSAddress)
        End Function

        '''<remarks/>
        Public Function BeginCorrectedAddressXml(ByVal accessCode As String, _
            ByVal address As String, ByVal city As String, ByVal state As String, _
            ByVal callback As System.AsyncCallback, ByVal asyncState As Object) _
            As System.IAsyncResult

            Return Me.BeginInvoke("CorrectedAddressXml", _
                New Object() {accessCode, address, city, state}, callback, asyncState)
        End Function

        Public Function EndCorrectedAddressXml(ByVal asyncResult _
            As System.IAsyncResult) As USPSAddress
            Dim results() As Object = Me.EndInvoke(asyncResult)
            Return CType(results(0), USPSAddress)
        End Function
    End Class

    <System.SerializableAttribute(), _
     System.Xml.Serialization.XmlTypeAttribute( _
        [Namespace]:="http://webservices.eraserver.net/")> _
    Public Class USPSAddress

        Private streetField As String

        Private cityField As String

        Private stateField As String

        Private shortZIPField As String

        Private fullZIPField As String


        Public Property Street() As String
            Get
                Return Me.streetField
            End Get
            Set(ByVal value As String)
                Me.streetField = value
            End Set
        End Property


        Public Property City() As String
            Get
                Return Me.cityField
            End Get
            Set(ByVal value As String)
                Me.cityField = value
            End Set
        End Property

        Public Property State() As String
            Get
                Return Me.stateField
            End Get
            Set(ByVal value As String)
                Me.stateField = value
            End Set
        End Property


        Public Property ShortZIP() As String
            Get
                Return Me.shortZIPField
            End Get
            Set(ByVal value As String)
                Me.shortZIPField = value
            End Set
        End Property


        Public Property FullZIP() As String
            Get
                Return Me.fullZIPField
            End Get
            Set(ByVal value As String)
                Me.fullZIPField = value
            End Set
        End Property
    End Class

    Public Delegate Sub CorrectedAddressXmlCompletedEventHandler(ByVal sender As Object, _
         ByVal args As CorrectedAddressXmlCompletedEventArgs)

    Public Class CorrectedAddressXmlCompletedEventArgs
        Inherits System.ComponentModel.AsyncCompletedEventArgs

        Private results() As Object

        Friend Sub New(ByVal results() As Object, ByVal exception As System.Exception, _
            ByVal cancelled As Boolean, ByVal userState As Object)
            MyBase.New(exception, cancelled, userState)
            Me.results = results
        End Sub

        Public ReadOnly Property Result() As USPSAddress
            Get
                Me.RaiseExceptionIfNecessary()
                Return CType(Me.results(0), USPSAddress)
            End Get
        End Property
    End Class

End Namespace

Compilation du code

Il s'agit d'un exemple complet qui inclut une méthode Main et une version raccourcie du code du proxy côté client.

Cet exemple nécessite :

  • Des références aux assemblys System, System.Drawing, System.Web.Services, System.Windows.Forms et System.Xml.

Voir aussi