방법: Windows Forms BindingSource를 사용하여 웹 서비스에 바인딩
업데이트: 2007년 11월
XML Web services를 호출하여 얻은 결과에 Windows Form 컨트롤을 바인딩하려는 경우 BindingSource 구성 요소를 사용하면 됩니다. 이 절차는 형식에 BindingSource 구성 요소를 바인딩하는 절차와 비슷합니다. Web services에서 노출되는 형식과 메서드를 포함하는 클라이언트측 프록시를 만들어야 합니다. 클라이언트측 프록시는 Web services(.asmx) 자체나 해당 WSDL(웹 서비스 설명 언어) 파일을 통해 생성합니다. 또한 클라이언트측 프록시에서는 Web services에서 사용되는 복잡한 형식의 필드를 공용 속성으로 노출해야 합니다. 그런 다음 Web services 프록시에서 노출되는 형식 중 하나로 BindingSource를 바인딩합니다.
Windows Form 컨트롤을 만들어 클라이언트측 프록시에 바인딩하려면
선택한 디렉터리에 적절한 네임스페이스를 사용하여 Windows Form을 만듭니다.
BindingSource 구성 요소를 폼에 추가합니다.
Windows SDK(소프트웨어 개발 키트) 명령 프롬프트를 열고 폼이 있는 디렉터리로 이동합니다.
wsdl을 입력한 다음 Web services에 대한 WSDL 파일 또는 .asmx의 URL과 응용 프로그램의 네임스페이스 및 사용 중인 언어(옵션)를 입력합니다.
다음 코드 예제에서는 http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx에 있는 Web services를 사용합니다. 예를 들어, 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를 사용 중이면 파일을 프로젝트에 추가합니다.
바인딩할 클라이언트측 프록시에서 형식을 선택합니다.
일반적으로 이 형식은 Web services가 제공하는 메서드에서 반환되는 형식입니다. 선택한 형식의 필드는 바인딩을 위해 공용 속성으로 노출되어야 합니다.
<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
[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 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; } } };
BindingSource의 DataSource 속성을 Web services 클라이언트측 프록시에 포함된 형식 중 원하는 형식으로 설정합니다.
BindingSource1.DataSource = GetType(USPSAddress)
BindingSource1.DataSource = typeof(USPSAddress);
BindingSource1->DataSource = USPSAddress::typeid;
Web services에 바인딩된 BindingSource에 컨트롤을 바인딩하려면
Web services 형식의 원하는 공용 속성을 매개 변수로 전달하여 BindingSource에 컨트롤을 바인딩합니다.
textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
예제
다음 코드 예제에서는 Web services에 BindingSource 구성 요소를 바인딩한 다음 BindingSource 구성 요소에 텍스트 상자를 바인딩하는 방법을 보여 줍니다. 단추를 클릭하면 Web services 메서드가 호출되고 textbox1에 결과가 표시됩니다.
Imports System
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
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]);
}
}
}
}
#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;
}
코드 컴파일
이 예제는 Main 메서드가 들어 있는 완전한 예제이며 클라이언트측 프록시 코드의 약식 버전입니다.
이 예제에는 다음 사항이 필요합니다.
- System, System.Drawing, System.Web.Services, System.Windows.Forms 및 System.Xml 어셈블리에 대한 참조
Visual Basic 또는 Visual C#의 명령줄에서 이 예제를 빌드하는 방법에 대한 자세한 내용은 명령줄에서 빌드(Visual Basic) 또는 csc.exe를 사용한 명령줄 빌드를 참조하십시오. Visual Studio에서 코드를 새 프로젝트에 붙여넣어 이 예제를 빌드할 수도 있습니다.