Практическое руководство. Связывание с веб-службой с помощью компонента BindingSource в Windows Forms
Компонент BindingSource можно использовать, если необходимо привязать элемент управления Windows Form к результатам вызова веб-служб XML. Эта процедура аналогична привязке компонента BindingSource к типу. Необходимо создать клиентский прокси, который содержит методы и типы, предоставляемые веб-службой. Клиентский прокси веб-службы можно создать либо непосредственно в самой веб-службе (ASMX-файл) или с помощью файла языка описания веб-служб (WSDL-файл). Кроме того, клиентский прокси должен предоставлять доступ к полям сложных типов, используемых веб-службой, в виде общих свойств. Затем BindingSource привязывается к одному из типов, доступных в прокси веб-службы.
Создание и привязка к прокси на стороне клиента
Создайте форму Windows Forms в каталоге по своему усмотрению с подходящим пространством имен.
Добавьте в форму компонент BindingSource.
Откройте командную строку Windows SDK и перейдите к каталогу, в котором расположена форма.
С помощью средства 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, добавьте файл в проект.Выберите тип для привязки в клиентском прокси.
Обычно это тип, возвращаемый методом, предлагаемым веб-службой. Поля выбранного типа должны предоставляться как общие свойства для привязки.
[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; } } }
Задайте для свойства 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 путем вставки кода в новый проект.