Vorgehensweise: Binden an einen Webdienst mithilfe der BindingSource in Windows Forms
Wenn Sie ein Windows Form-Steuerelements an die Ergebnisse des Aufrufs eines XML-Webdiensts binden möchten, können Sie eine BindingSource-Komponente verwenden. Dieses Verfahren ähnelt der Bindung einer BindingSource-Komponente an einen Typ. Sie müssen einen clientseitigen Proxy erstellen, der die Methoden und Typen enthält, die vom Webdienst bereitgestellt werden. Sie generieren einen clientseitigen Proxy über den Webdienst (.asmx) selbst oder über seine WSDL-Datei (Web Services Description Language). Darüber hinaus muss der clientseitige Proxy die Felder von komplexen Typen verfügbar machen, die vom Webdienst als öffentliche Eigenschaften verwendet werden. Anschließend binden Sie BindingSource an einen der im Webdienstproxy bereitgestellten Typen.
So erstellen und binden Sie einen clientseitigen Proxy
Erstellen Sie ein Windows Form mit einem geeigneten Namespace im gewünschten Verzeichnis.
Fügen Sie eine BindingSource-Komponente zum Formular hinzu.
Öffnen Sie die Windows Software Development Kit (SDK)-Eingabeaufforderung, und navigieren Sie zu demselben Verzeichnis, in dem sich Ihr Formular befindet.
Geben Sie mithilfe des WSDL-Tools
wsdl
und die URL für die ASMX- oder WSDL-Datei für den Webdienst gefolgt vom Namespace der Anwendung und wahlweise der verwendeten Programmiersprache ein.Das folgende Codebeispiel verwendet den Webdienst unter
http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx
. Geben Sie z.B. für C#wsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService
oder für Visual Basicwsdl http://webservices.eraserver.net.zipcoderesolver/zipcoderesolver.asmx /n:BindToWebService /language:VB
ein. Durch die Übergabe des Pfads als Argument an das WSDL-Tool wird ein clientseitiger Proxy in demselben Verzeichnis und Namespace wie Ihre Anwendung sowie in der angegebenen Sprache generiert. Fügen Sie die Datei zu Ihrem Projekt hinzu, wenn Sie Visual Studio verwenden.Wählen Sie im clientseitigen Proxy einen Typ für die Bindung aus.
Dies ist normalerweise ein Typ, der von einer vom Webdienst angebotenen Methode zurückgegeben wird. Die Felder des ausgewählten Typs müssen zu Bindungszwecken als öffentliche Eigenschaften verfügbar gemacht werden.
[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
Legen Sie für die DataSource-Eigenschaft von BindingSource den gewünschten Typ fest, der im clientseitigen Proxy des Webdiensts enthalten ist.
BindingSource1->DataSource = USPSAddress::typeid;
BindingSource1.DataSource = typeof(USPSAddress);
BindingSource1.DataSource = GetType(USPSAddress)
So binden Sie Steuerelemente an die Bindungsquelle, die an einen Webdienst gebunden ist
Binden Sie Steuerelemente an BindingSource, wobei Sie die öffentliche Eigenschaft des Webdiensttyps übergeben, den Sie als Parameter verwenden möchten.
textBox1->DataBindings->Add("Text", this->BindingSource1, "FullZIP", true);
textBox1.DataBindings.Add("Text", this.BindingSource1, "FullZIP", true);
textBox1.DataBindings.Add("Text", Me.BindingSource1, "FullZIP", True)
Beispiel
Das folgende Codebeispiel veranschaulicht das Binden einer BindingSource-Komponente an einen Webdienst und das anschließende Binden eines Textfelds an die BindingSource-Komponente. Wenn Sie auf die Schaltfläche klicken, wird eine Webdienstmethode aufgerufen und die Ergebnisse werden in textbox1
angezeigt.
#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
Kompilieren des Codes
Dies ist ein vollständiges Beispiel, das eine Main
-Methode und eine verkürzte Version des clientseitigen Proxycodes enthält.
Für dieses Beispiel benötigen Sie Folgendes:
- Verweise auf die Assemblys "System", "System.Drawing", "System.Web.Services", "System.Windows.Forms" und "System.Xml".
Weitere Informationen
.NET Desktop feedback