방법: Windows Forms BindingSource를 사용하여 웹 서비스에 바인딩
XML Web services 호출에서 얻은 결과에 Windows Form 컨트롤을 바인딩하려면 BindingSource 구성 요소를 사용하면 됩니다. 이 절차는 BindingSource 구성 요소를 형식에 바인딩하는 것과 비슷합니다. 웹 서비스에 의해 노출되는 메서드와 형식이 포함된 클라이언트 측 프록시를 만들어야 합니다. 웹 서비스(.asmx) 자체 또는 WSDL(Web Services Description Language) 파일에서 클라이언트 측 프록시를 생성합니다. 또한 클라이언트 측 프록시는 웹 서비스에서 공용 속성으로 사용되는 복합 형식의 필드를 노출해야 합니다. 그리고 나서 BindingSource를 웹 서비스 프록시에 노출된 형식의 하나에 바인딩합니다.
클라이언트 측 프록시를 만들고 바인딩하려면 다음을 수행합니다.
적절한 네임스페이스를 사용하여 선택한 디렉터리에서 Windows Form을 만듭니다.
폼에 BindingSource 구성 요소를 추가합니다.
Windows SDK(소프트웨어 개발 키트) 명령 프롬프트를 열고 양식이 있는 같은 디렉터리로 이동합니다.
WSDL 도구를 사용하여
wsdl
, 웹 서비스에 대한 .asmx 또는 WSDL 파일의 URL, 애플리케이션의 네임스페이스를 차례로 입력하고 선택적으로 사용 중인 언어를 입력합니다.다음 코드 예제에서는
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 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
BindingSource의 DataSource 속성을 웹 서비스 클라이언트 측 프록시에 포함된 원하는 형식으로 설정합니다.
BindingSource1->DataSource = USPSAddress::typeid;
BindingSource1.DataSource = typeof(USPSAddress);
BindingSource1.DataSource = GetType(USPSAddress)
웹 서비스에 바인딩된 BindingSource에 컨트롤을 바인딩하려면 다음을 수행합니다.
컨트롤을 BindingSource에 바인딩하여 원하는 웹 서비스 형식의 공용 속성을 매개 변수로 전달합니다.
textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
예제
다음 코드 예제에서는 BindingSource 구성 요소를 웹 서비스에 바인딩하는 방법과 텍스트 상자를 BindingSource 구성 요소에 바인딩하는 방법을 차례로 보여 줍니다. 단추를 클릭할 때 웹 서비스 메서드가 호출되고 결과가 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
코드 컴파일
이 전체 예제에는 Main
메서드와 클라이언트 측 프록시 코드의 간략 버전이 포함됩니다.
이 예제에는 다음 사항이 필요합니다.
- System, System.Drawing, System.Web.Services, System.Windows.Forms 및 System.Xml 어셈블리에 대한 참조
참고 항목
.NET Desktop feedback