Show / Hide Table of Contents

Практическое руководство. Связывание с веб-службой с помощью компонента BindingSource в Windows Forms

Компонент BindingSource можно использовать, если необходимо привязать элемент управления Windows Form к результатам вызова веб-служб XML. Эта процедура аналогична привязке компонента BindingSource к типу. Необходимо создать клиентский прокси, который содержит методы и типы, предоставляемые веб-службой. Клиентский прокси веб-службы можно создать либо непосредственно в самой веб-службе (ASMX-файл) или с помощью файла языка описания веб-служб (WSDL-файл). Кроме того, клиентский прокси должен предоставлять доступ к полям сложных типов, используемых веб-службой, в виде общих свойств. Затем BindingSource привязывается к одному из типов, доступных в прокси веб-службы.

Создание и привязка к прокси на стороне клиента

  1. Создайте форму Windows Forms в каталоге по своему усмотрению с подходящим пространством имен.

  2. Добавьте в форму компонент BindingSource.

  3. Откройте командную строку Windows SDK и перейдите к каталогу, в котором расположена форма.

  4. С помощью средства WSDL введите wsdl и URL-адрес для ASMX- или WSDL-файла веб-службы, пространство имен приложения и при необходимости язык, с которым вы работаете.

    В следующем примере кода используется веб-службы, расположенный http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx. Например, для C# типа wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService или для Visual Basic введите wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService /language:VB. Передача пути в качестве аргумента для средства WSDL создаст клиентский прокси в том же каталоге и с тем пространством имен, что и у приложения, и на указанном языке. Если вы используете Visual Studio, добавьте файл в проект.

  5. Выберите тип для привязки в клиентском прокси.

    Обычно это тип, возвращаемый методом, предлагаемым веб-службой. Поля выбранного типа должны предоставляться как общие свойства для привязки.

    [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;
            }
        }
    }
    
  6. Задайте для свойства DataSource в BindingSource нужный тип, содержащийся в клиентском прокси веб-службы.

    BindingSource1.DataSource = typeof(USPSAddress);
    

Привязка элементов управления к компоненту BindingSource, который привязан к веб-службе

  • Привяжите элементы управления к BindingSource, передав в качестве параметра общее свойство типа веб-службы.

    textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
    

Пример

В следующем примере кода показано, как привязать компонент BindingSource к веб-службе, а затем привязать текстовое поле к компоненту BindingSource. При нажатии кнопки вызывается метод веб-службы, результаты будут отображаться в textbox1.

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]);
            }
        }
    }
 }

Компиляция кода

Это завершенный пример, включающий метод Main и сокращенную версию кода клиентского прокси.

Для этого примера требуются:

  • ссылки на сборки System, System.Drawing, System.Web.Services, System.Windows.Forms и System.XML.

Сведения о выполнении сборки этого примера из командной строки для Visual Basic или Visual C#, см. в разделе построение из командной строки или командной строки создания с помощью csc.exe. Можно также сборке этого примера в Visual Studio путем вставки кода в новый проект.

См. также

  • Компонент BindingSource
  • Практическое руководство. Связывание элемента управления с типом в Windows Forms
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX