16.3 Einen Web Service verwenden
 
Beim realen Einsatz von Web Services stellt sich für denjenigen, der einen Web Service nutzen will, als Erstes die Aufgabe, den passenden Web Service zu finden. Dazu gibt es eine Reihe von Technologien, zu denen Discovery-Dateien und UDDI gehören. Mit Hilfe dieser Technologien ist es möglich, den URL des gewünschten Web Services zu ermitteln. Der Einfachheit halber soll dieser Schritt hier jedoch zunächst noch ausgeblendet werden.
Denn wenn Sie den URL des Web Services, den Sie nutzen möchten, bereits kennen, können Sie ohne weitere Umwege direkt damit beginnen, den Web Service zu nutzen. Von dieser Situation soll zunächst ausgegangen werden.
Diejenige Software, die den Web Service eines anderen Rechners nutzen möchte, kann eines nicht: Sie kann den Web Service nicht einfach über den URL aufrufen. Für die Kommunikation mit dem Web Service müssen erst die geeigneten SOAP-Daten erzeugt werden. Dazu gehört ein SOAP-Umschlag mit den korrekten Daten für den SOAP-Header und den SOAP-Body. Insgesamt ist das relativ viel Arbeit.
Diese aufwendige Kommunikationsarbeit muss nicht die Anwendungs-Software selbst ausführen. Diese Arbeit kann stattdessen eine Proxyklasse übernehmen.
Eine Proxyklasse kann man sich so ähnlich wie einen Kurier vorstellen. Wenn Person A und Person B sich austauschen möchten, aber zu weit voneinander entfernt sind, um direkt miteinander reden zu können, können sie ihre Nachrichten einem Kurier anvertrauen. Der Kurier kennt den Weg und transportiert die Nachrichten hin und her. Die beiden Personen reden nie direkt miteinander, sondern immer nur über den Kurier. Durch den Einsatz des Kuriers haben die beiden Personen den Vorteil, dass sie nicht selbst hin- und herreisen müssen, sondern zuhause bleiben können.
Einen solchen Kurier muss der Entwickler, der einen Web Service nutzen will, in Form einer Proxyklasse erstellen. Mit Hilfe dieser Proxyklasse kann der Entwickler in einer gewöhnlichen aspx-Seite etwa folgenden Code schreiben:
Dim h As new Hallo
ausgabe.Text = h.sagHallo()
Dieser Code erzeugt ein neues Objekt vom Typ Hallo und ruft anschließend dessen Methode sagHallo() auf. Diese Klasse Hallo ist die Proxyklasse. Wie kann ein Entwickler diese Proxyklasse erstellen?
16.3.1 Eine Proxyklasse erstellen
 
Der Entwickler, der den Rechner betreut, der einen Web Service nutzen soll, muss die Proxyklasse erstellen und kompiliert zur Verfügung stellen. Dabei helfen ihm die Web Services Description Language und natürlich die .NET-Werkzeuge.
Der Web Service von Rechner 1 muss dem Entwickler, der an Rechner 2 sitzt, irgendwie mitteilen, wie er eigentlich funktioniert. Das kann ein Web Service, denn er spricht die Web Services Description Language (WSDL). Ein Web Service kann sich also mit Hilfe der WSDL selbst beschreiben und diese Selbstbeschreibung einem Interessenten zuschicken.
Und .NET kann noch etwas ganz Tolles: .NET kann eine solche Selbstbeschreibung im WSDL-Format entgegennehmen und daraus den VB-Quellcode für die Proxyklasse generieren. Der Entwickler an Rechner 2 muss dann nur noch diesen VB-Quellcode kompilieren und im Verzeichnis /bin einfügen. Damit hat er die benötigte Proxyklasse erstellt. Ein .NET-Entwickler benötigt mit anderen Worten keinerlei Kenntnisse der WSDL und kann dennoch mit ihr arbeiten.
Den Code der Proxyklasse generieren
Das Abrufen der Selbstbeschreibung im WSDL-Format und die Umformung der WSDL-Selbstbeschreibung in VB-Quellcode fasst das Kommandozeilenprogramm wsdl.exe zusammen.
Die Syntax von wsdl.exe lautet:
wsdl [Optionen] { URL | Pfad }
Tabelle 16.1 verzeichnet die Optionen von wsdl.exe.
wsdl [Optionen] URL oder Pfad
Als URL geben Sie eine wsdl-, xsd- oder eine disco-Datei an. Wenn Sie einen lokalen Pfad verwenden, können Sie außerdem auch eine discomap-Datei angeben.
|
/appsettingurlkey: oder
/urlkey:<Schlüssel>
|
Gibt beim Generieren von Code den Konfigurationsschlüssel an, der zum Lesen des Standardwerts für die URL-Eigenschaft verwendet wird
|
/appsettingbaseurl: oder /baseurl:<Basis-URL>
|
Gibt beim Berechnen des URL-Fragments den zu verwendenden Basis-URL an. Das Tool berechnet das URL-Fragment durch Konvertierung des relativen URLs aus dem baseurl-Argument zum URL des WSDL-Dokuments. Bei dieser Option müssen Sie die appsettingurlkey-Option angeben.
|
/domain: oder /d:<Domäne>
|
Domänenname für die Verbindung zu einem Server mit erforderlicher Authentifizierung
|
/language: oder
/l:<Sprache>
|
Die Sprache, in der die Proxyklasse generiert werden soll. Zur Auswahl stehen CS (Default), VB und JS.
|
/namespace: oder
/n:<Namensraum>
|
Der Namensraum für den zu generierenden Proxy. Default ist der globale Namensraum.
|
/nologo
|
Unterdrückt die Microsoft-Startmeldung
|
/out: oder /o:<Dateiname>
|
Name der Datei, in der der Code der Proxyklasse gespeichert werden soll
|
/password: oder
/p:<Passwort>
|
Passwort für die Authentifizierung
|
/protocol:<Protokoll>
|
Das zu implementierende Protokoll. Zur Auswahl stehen SOAP (Default), HttpGet und HttpPost. In der Konfigurationsdatei kann außerdem ein benutzerdefiniertes Protokoll angegeben werden.
|
/proxy:<URL>
|
Der URL des Proxyservers, der verwendet werden soll. Nur nötig, wenn nicht die Standardeinstellung des Systems verwendet werden soll
|
/proxydomain: oder
/pd:<Domäne>
|
Die Domäne für die Verbindung mit einem Proxyserver, der eine Authentifizierung erfordert
|
/proxypassword: oder
/pp:<Passwort>
|
Passwort für einen Proxyserver, der eine Authentifizierung erfordert
|
/proxyusername oder
/pu:<Username>
|
Benutzername für einen Proxyserver, der eine Authentifizierung erfordert
|
/Server
|
Generiert eine abstrakte Klasse für einen XML-Webdienst, der auf Verträgen basiert. Standardmäßig werden Client-Proxyklassen generiert.
|
/username: oder
/u:<Username>
|
Anwendername für einen Server mit erforderlicher Authentifizierung
|
/?
|
Listet alle Optionen auf
|
Tabelle 16.1 Optionen von wsdl.exe
Die Proxyklasse für den Hallo-Web-Service erzeugen Sie mit diesem Aufruf:
wsdl /l:vb /n:myWebServiceConsumer
http://localhost/ASPdotNETBuch/Listings/webservice01.asmx?WSDL
Mit der Option /l:vb geben Sie an, dass die Klasse in der Sprache VB.NET erzeugt werden soll. Die Option /n:myWebServiceConsumer definiert den Namensraum, unter dem diese Klasse auf Rechner 2 verwendet wird. Abschließend geben Sie den URL des Web Services an und hängen an den URL den Zusatz ?WSDL an. Ihr Web Service erzeugt damit eine Beschreibung seiner selbst im WSDL-Format. Das Konsolenprogramm wsdl.exe kann aus einer Beschreibung in diesem Format eine Proxyklasse erzeugen.
Bei erfolgreicher Ausführung meldet das Programm
Datei ' .....\webservice01.vb' wird geschrieben.
Damit verfügen Sie über den maschinell erzeugten Quellcode für die Proxyklasse, die Sie jetzt noch kompilieren müssen. Der folgende Code wurde erzeugt. Beachten Sie, dass teilweise sehr lange Zeilen entstanden sind, die für den Abdruck mehrfach umbrochen werden mussten. Die Lesbarkeit hat darunter leider gelitten.
'------------------------------------------------------
' <autogenerated>
' This code was generated by a tool.
' Runtime Version: 1.0.3705.0
'
' Changes to this file may cause incorrect behavior
' and will be lost if the code is regenerated.
' </autogenerated>
'------------------------------------------------------
Option Strict Off
Option Explicit On
Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml.Serialization
'
' Der Quellcode wurde von wsdl automatisch generiert.
' Version=1.0.3705.0.
'
Namespace myWebServiceConsumer
'<remarks/>
<System.Diagnostics. _
DebuggerStepThroughAttribute(), _
System.ComponentModel. _
DesignerCategoryAttribute("code"), _
System.Web.Services.WebServiceBindingAttribute _
(Name:="webservice01Soap", _
[Namespace]:="http://mlohrer.de/services")> _
Public Class webservice01
Inherits System.Web.Services.Protocols. _
SoapHttpClientProtocol
'<remarks/>
Public Sub New()
MyBase.New
Me.Url = "http://localhost/ASPdotNETBuch/"
Me.Url &= "Listings/webservice01.asmx"
End Sub
'<remarks/>
<System.Web.Services.Protocols. _
SoapDocumentMethodAttribute _
("http://mlohrer.de/services/SagHallo", _
RequestNamespace:= _
"http://mlohrer.de/services", _
ResponseNamespace:= _
"http://mlohrer.de/services", _
Use:=System.Web.Services.Description. _
SoapBindingUse.Literal, _
ParameterStyle:= _
System.Web.Services.Protocols. _
SoapParameterStyle.Wrapped)> _
Public Function SagHallo() As String
Dim results() As Object = _
Me.Invoke("SagHallo", New Object(-1) {})
Return CType(results(0),String)
End Function
'<remarks/>
Public Function BeginSagHallo _
(ByVal callback As System.AsyncCallback, _
ByVal asyncState As Object) _
As System.IAsyncResult
Return Me.BeginInvoke _
("SagHallo", New Object(-1) {}, _
callback, asyncState)
End Function
'<remarks/>
Public Function EndSagHallo _
(ByVal asyncResult As System.IAsyncResult) _
As String
Dim results() As Object = _
Me.EndInvoke(asyncResult)
Return CType(results(0),String)
End Function
End Class
End Namespace
Die Proxyklasse kompilieren
Kompilieren Sie die generierte Klasse webservice01.vb mit diesem Compiler-Aufruf:
vbc /t:library /out:../bin/myWebServiceConsumer.dll /r:System.dll
/r:System.Xml.dll /r:System.Web.Services.dll webservice01.vb
Der Quellcode liegt in der Datei webservice01.vb. Die Zieldatei soll aber nach dem verwendeten Namensraum myWebServiceConsumer.dll heißen. Damit haben Sie die benötigte Proxyklasse erzeugt, und Sie können den Web Service aus Ihrem Programmcode heraus aufrufen.
Die Proxyklasse verwenden
Die Proxyklasse ist eine normale .NET-Klasse. Sie können sie wie jede andere Klasse in Ihrem Code verwenden. Den gewünschten Web Service rufen Sie auf, indem Sie die entsprechende Methode der Proxyklasse aufrufen. webservice01.aspx demonstriert das Verfahren. Abbildung 16.5 zeigt die Darstellung im Browser.
<!-- webservice01.aspx -->
<%@ Page language="VB" strict="true" debug="true" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim w As new myWebServiceConsumer.webservice01
ausgabe.Text = w.sagHallo()
End Sub
</script>
<html><head>
<title>Hallo-Webservice</title>
</head><body>
<asp:Label
id="ausgabe"
runat="server" />
</body></html>
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.5 Primitiv? Von wegen! Das Wort »Hallo« stammt von einem Web Service!
Damit haben Sie den ersten Durchgang geschafft. Sie wissen jetzt, dass Sie mit einer asmx-Datei einen Web Service anbieten können. Sie wissen außerdem, dass Sie mit wsdl.exe eine Proxyklasse erzeugen können, wenn Sie einen Web Service nutzen möchten. Sie können die Proxyklasse kompilieren und aus Ihrem Code heraus verwenden.
|