Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel 16 Web Services
  gp 16.1 Wie Web Services funktionieren
    gp 16.1.1 Basistechnologie HTTP
    gp 16.1.2 Basistechnologie XML
    gp 16.1.3 Basistechnologie SOAP
    gp 16.1.4 Umdenken beim Entwickeln von Web Services
  gp 16.2 Einen einfachen Web Service erstellen und anbieten
    gp 16.2.1 Die Datei webservice01.asmx erstellen
    gp 16.2.2 webservice01.asmx im Browser aufrufen
  gp 16.3 Einen Web Service verwenden
    gp 16.3.1 Eine Proxyklasse erstellen
  gp 16.4 Einen Web Service mit einem SOAP-Header sichern
    gp 16.4.1 Einen passwortgeschützten Web Service erstellen
    gp 16.4.2 Die Proxyklasse erzeugen
    gp 16.4.3 Den passwortgeschützten Web Service aufrufen
    gp 16.4.4 Fazit: Web Services und Sicherheit
  gp 16.5 Ein DataSet-Objekt übertragen
    gp 16.5.1 Den Web Service in einer asmx-Datei erstellen
    gp 16.5.2 Die Proxyklasse erzeugen
  gp 16.6 Web Services finden
    gp 16.6.1 Discovery
    gp 16.6.2 UDDI
  gp 16.7 Zusammenfassung und Ausblick
    gp 16.7.1 Zusammenfassung
    gp 16.7.2 Ausblick
    gp 16.7.3 Ressourcen


Galileo Computing

16.3 Einen Web Service verwenden  downtop

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?


Galileo Computing

16.3.1 Eine Proxyklasse erstellen  toptop

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>

Abbildung
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.

  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de