Verteilte Systeme SoSe 2007 Service-Oriented Architecture und Web Services Service-Oriented Architecture (SOA) [1] Ziel: Entwicklung einer robusten Architektur zur einfachen, schnellen und sicheren Integration von Systemen und Applikationen, verteilter und heterogener Plattformen SOAs sind unabhängig von der zugrundeliegenden Plattform den verwendeten Protokollen Programiersprachen Hardware … SOAs bieten einen abstrakten Blick auf die Geschäftswelt 2 1 Service-Oriented Architecture (SOA) [2] Zur Entwicklung solcher Systeme eignet sich die Kombination von Java (plattformunabhängig Programmiersprache) und XML (plattformunabhängige Repräsentation von Daten). Komponenten werden als Service modelliert, die über das Netzwerk aufgerufen werden können. Ein Service wird durch ein Interface beschrieben, das alle Informationen enthält, um den Service aufrufen zu können. Die Integration von Komponenten wird von der Applikationsebene auf die Interface-Ebene verschoben, was zu looser Kopplung führt. 3 Architektur [1] SOAs können in vier Schichten unterteilt werden: Präsentationsschicht Prozessschicht Serviceschicht Systemschicht 4 2 Architekur [2] Die Präsentationsschicht regelt die Kommunikation mit dem Endnutzer, z.B. über einen Browser. Die Trennung von Präsentationsschicht und Geschäftsprozessen erlaubt das Anbieten der selben Geschäftsprozesse über unterschiedliche Schnittstellen. Die Prozessschicht kombiniert Services zu Geschäftsprozessen gemäß gegebener Regeln. Durch Trennung von Prozessen und Services wird es möglich, Prozesse leicht zu modifizieren und neue Prozesse anzulegen. 5 Architekur [3] Die Serviceschicht bietet eine Menge von Services an, die Geschäftsfunktionalität kapseln. Man unterscheidet grobkörnige und feinkörnige Services. Die Systemschicht enthält die tatsächliche Implementierung eines Service der Serviceschicht. Da die Serviceschicht die Details der Systemschicht versteckt, kann die Implementierung leicht ausgetauscht oder modifiziert werden. 6 3 Rollen und Operation in einer SOA [1] 7 Rollen und Operation in einer SOA [2] Der Service Provider erzeugt eine Servicebeschreibung und deployt den Service, so dass er über das Netzwerk erreichbar ist. Die Servicebeschreibung wird bei einer oder mehreren Service Registries mit Hilfe der publish()Operation hinterlegt und kann als Vertrag zwischen Service Provider und Service Consumer verstanden werden. Der Service Consumer (Serivce Requestor) sucht nach einer Servicebeschreibung in einer oder mehreren Service Registries mit Hilfe der find()-Operation. Nachdem er einen passenden Service gefunden hat, nutzt er die bind()Operation, um sich an den Service zu binden. Beispielsweise werden jetzt Stubs erzeugt, um den Service aufzurufen. Die Service Registry macht ihre Servicebschreibungen bekannt, damit Service Consumers einen passenden Service finden können. 8 4 Vorteile von SOAs Integration von Geschäftsprozessen schnelle Reaktion auf Änderungen der Geschäftswelt Interoperabilität, Plattform- und Programmiersprachenunabhängigkeit kürzere Time-to-Market Wiederverwendung von Komponenten Integration von Legacy-Systemen langfristige Kostenersparnis 9 Unterschiede zu RPC, RMI und CORBA Remote Procedure Call (RPC) verteilt Anwendungen auf Funktionsebene. Remote Method Invocation (RMI) und Common Object Request Broker Architecture (CORBA) verteilen Anwendungen auf Basis von Objekten. In SOAs werden Anwendungen auf Ebene der Interfaces von Services verteilt. Dies ist in der Industrie leichter verständlich. 10 5 Web Services Web Services ist die am meisten verbreitete Technik, um SOAs zu implementieren Web Services benutzen offene Standards, die von bekannten Industrieunternehmen gemeinschaftlich entwickelt wurden: SOAP Web Services Description Language (WSDL) Universal Description, Discovery and Integration (UDDI) Dies ermöglicht Interoperabilität zwischen verschiedenen Anwendungen in verschiedenen Unternehmen. 11 SOAP (I) “SOAP Version 1.2 (SOAP) is a lightweight protocol intended for exchanging structured information in a decentralized, distributed environment. It uses XML technologies to define an extensible messaging framework providing a message construct that can be exchanged over a variety of underlying protocols. The framework has been designed to be independent of any particular programming model and other implementation specific semantics.” (World Wide Web Consortium, W3C) 12 6 SOAP SOAP (ehemals: Simple Object Access Protocol) ist ein Kommunikationsprotokoll für die Kommunikation zwischen Anwendungen ist ein Format zum Senden von Nachrichten erlaubt eine lose gekoppelte Kommunikation und ist damit zur Kommunikation über das Internet geeignet ist XML basiert ist plattformunabhängig ist sprachunabhängig ist erweiterbar über HTTP erlaubt das Umgehen von Firewalls ist standardisiert (W3C Standard) 13 Aufbau einer SOAP-Nachricht [1] Eine SOAP-Nachricht muss in XML kodiert sein den SOAP-Envelope Namensraum verwenden http://www.w3.org/2001/12/soap-envelope Eine SOAP-Nachricht darf keine Referenz auf eine DTD enthalten XML Processing Instructions enthalten 14 7 Aufbau einer SOAP-Nachricht [2] <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... SOAP Envelope </soap:Header> <soap:Body> SOAP Header ... <soap:Fault> SOAP Body ... </soap:Fault> </soap:Body> SOAP Fault </soap:Envelope> 15 SOAP Header [1] Der SOAP-Envelope Namensraum definiert drei Attribute, die für Header-Elemente verwendet werden können: actor mustUnderstand Das actor-Attribut legt fest, für welche Stationen das jeweilige Element relevant ist. Ein mustUnderstand-Element muss vom Empfänger verstanden werden. Kann der Empfänger das Element nicht interpretieren, muss die Verarbeitung des Headers abgebrochen werden. encodingStyle Das encodingStyle-Attribut legt die verwendbaren Datentypen innerhalb des entsprechenden Elements fest. 16 8 SOAP Header [2] Der SOAP Header ist optional und enthält anwendungsspezifische Informationen (z.B. Authentifizierungsinformationen). <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> <h:Hello xmlns:h="http://www.example.com/sampleheader/" soap:mustUnderstand="1"> Good Day </h:Hello> </soap:Header> ... </soap:Envelope> Durch das Attribut mustUnderstand wird angegeben, dass der Empfänger das zugehörige Element verstehen können muss. 17 SOAP Body mit Request Message Der SOAP Body enthält die eigentliche SOAP Nachricht. Dies umfasst die aufzurufende Operation (Methode) und deren Parameter. <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <echo soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <s xsi:type="xsd:string">Hallo Welt</s> </echo> </soapenv:Body> </soapenv:Envelope> 18 9 SOAP Body mit Response Message Eine Antwortnachricht könnte folgendermaßen aussehen: <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <echoResponse soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <echoReturn xsi:type="xsd:string">Hallo Welt</echoReturn> </echoResponse> </soapenv:Body> </soapenv:Envelope> 19 SOAP Fault [1] Ein Fault-Element besitzt die folgenden Kind-Elemente faultcode faultstring faultactor detail Fehlernummer zur Identifikation menschenlesbare Beschreibung des Fehlers Station, die den Fehler ausgelöst hat applikationsspezifische Fehlerinformationen 20 10 SOAP Fault [2] <soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Fault> <faultcode>soapenv:Server.userException</faultcode> <faultstring>javax.xml.soap.SOAPException: User not authenticated. Please authenticate first!</faultstring> <detail> <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/"> DANGERSEEKER </ns1:hostname> </detail> </soapenv:Fault> </soapenv:Body> 21 SOAP Binding SOAP Nachrichten können generell über ein beliebiges Transportprotokoll versendet werden (HTTP, SMTP, ...). Üblich ist HTTP mittels GET oder POST. POST /axis/services/EchoService HTTP/1.0 Content-Type: text/xml; charset=utf-8 Host: localhost:8090 Content-Length: 343 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <getHelloWorld/> </soapenv:Body> </soapenv:Envelope> 22 11 EchoService in Java package de.fb12.informatik.webservices.server; public class EchoService { public String echo(String input) { return input; } public String getHelloWorld() { return "Hello World!"; } } 23 WSDL WSDL (Web Services Description Language) beschreibt den Ort eines Web Service und dessen Operationen (Methoden) ist XML basiert März 2001: WSDL 1.1 wird als W3C Note veröffentlicht Juli 2002: WSDL 1.2 wird als Working Draft veröffentlicht Zur Zeit wird an WSDL 2.0 gearbeitet. WSDL ist noch kein W3C Standard. 24 12 Aufbau eines WSDL-Dokuments <?xml version="1.0" encoding="UTF-8"?> <definitions> <types> <!-- Definiert die Datentypen, die der Service verwendet mit Hilfe von XMLSchema. --> </types> <message> <!-- Definiert die Nachrichten, die der Service benutzt. --> </message> <portType> <!-- Definiert die Operationen (Methoden), die vom Service angeboten werden. --> </portType> <binding> <!-- Definiert das Protokoll, das der Service verwendet. --> </binding> </definitions> 25 Beispiel: EchoService WSDL <messages> <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/EchoService" xmlns:impl="http://localhost:8080/axis/services/EchoService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:message name="echoResponse"> <wsdl:part name="echoReturn" type="xsd:string"/> </wsdl:message> <wsdl:message name="getHelloWorldRequest"></wsdl:message> <wsdl:message name="getHelloWorldResponse"> <wsdl:part name="getHelloWorldReturn" type="xsd:string"/> </wsdl:message> <wsdl:message name="echoRequest"> <wsdl:part name="input" type="xsd:string"/> </wsdl:message> 26 13 Beispiel: EchoService WSDL <portType> <wsdl:portType name="EchoService"> <wsdl:operation name="echo" parameterOrder="input"> <wsdl:input message="impl:echoRequest" name="echoRequest"/> <wsdl:output message="impl:echoResponse" name="echoResponse"/> </wsdl:operation> <wsdl:operation name="getHelloWorld"> <wsdl:input message="impl:getHelloWorldRequest" name="getHelloWorldRequest"/> <wsdl:output message="impl:getHelloWorldResponse" name="getHelloWorldResponse"/> </wsdl:operation> </wsdl:portType> Durch die Definition einer input message und output message wird eine RPC Kommunikation festgelegt. Wird keine output message definiert, findet eine one-way Kommunikation statt. 27 Beispiel: EchoService WSDL <binding> [1] <wsdl:binding name="EchoServiceSoapBinding" type="impl:EchoService"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="echo"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="echoRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://server.webservices.informatik.fb12.de" use="encoded"/> </wsdl:input> <wsdl:output name="echoResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/EchoService" use="encoded"/> </wsdl:output> </wsdl:operation> 28 14 Beispiel: EchoService WSDL <binding> [2] <wsdl:operation name="getHelloWorld"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getHelloWorldRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://server.webservices.informatik.fb12.de" use="encoded"/> </wsdl:input> <wsdl:output name="getHelloWorldResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/EchoService" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> 29 UDDI (Universal Description, Discovery and Integration) dient der Entdeckung/Auffindung und Integration/Einbindung von Web Services dient als Verzeichnis für WSDL erstellte Web Service Beschreibungen kommuniziert über SOAP standardisiert die Art und Weise wie Unternehmen ihre Kunden mit Informationen über Produkte und Services erreichen 30 15 SwA (SOAP Messages with Attachments) Da SOAP base64-encoding benutzt, ist es nicht geeignet, um Binärdaten zu übertragen. (Die Nutzlast nimmt um 33% zu.) Daher wurde die SwA-Spezifikation eingeführt. SwA ermöglicht es SOAP Nachrichten als MIME Nachrichten oder mit MIME Nachrichten im Anhang zu versenden. call Client Web-Service SOAP part attachment part 1 : attachment part n 31 SOAP Nachrichten erstellen mit SAAJ [1] import java.net.URL; import javax.xml.soap.*; public class saajEchoClient{ public static void main(String[] args){ try{ MessageFactory factory = MessageFactory.newInstance(); SOAPFactory soapFactory = SOAPFactory.newInstance(); // create new message SOAPMessage message = factory.createMessage(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPHeader header = envelope.getHeader(); SOAPBody body = envelope.getBody(); // add element to body Name bodyName = soapFactory.createName("echo"); SOAPBodyElement bodyElement = body.addBodyElement(bodyName); bodyElement.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/"); // add child element to body Name elementName = soapFactory.createName("s"); SOAPElement s = bodyElement.addChildElement(elementName); s.setValue("Hallo Welt"); 32 16 SOAP Nachrichten erstellen mit SAAJ [2] // add attachment AttachmentPart attach = message.createAttachmentPart(); attach.setMimeHeader("Content-Type", "text/plain"); String stringContent = "Nochmals Hallo"; attach.setContent(stringContent, "text/plain"); message.addAttachmentPart(attach); // realize connection SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); URL endpoint = new URL("http://localhost:8080/axis/services/EchoService"); SOAPMessage response = connection.call(message, endpoint); SOAPBody respBody = response.getSOAPBody(); System.out.println(respBody.toString()); } catch (Exception e) { e.printStackTrace(); } } } 33 Web Service Engines für Java Apache Axis Apache Axis 2 X Fire IBM Web Sphere 34 17 Apache Axis ist eine open-source Web Service engine des Apache Web Services Project ist eine Implementierung des SOAP Protocols läuft in Verbindung mit Tomcat als SOAP Processing Engine erlaubt den Transfer und die Bearbeitung von SOAP Messages 35 Handler und Chain-Konzept [1] Jede SOAP-Nachricht wird in einen Message Context gebettet. Dieser Kontext kann von einem Handler bearbeitet werden. Mehrere Handler können zu einer Chain zusammengefasst werden. In Axis gibt es drei vordefinierte Chains: Transport Chain: kümmert sich um die Übertragung und den Empfang von Daten, z.B. HTTP Sender und Empfänger. Global Chain: kümmert sich um Belange, die jeden Service betreffen, z.B. security, ... Service Chain: kümmert sich um die Belange, die jeden einzelnen Service betreffen, z.B. Fehlerkorrektur von Eingaben, Umwandlung von Daten, ... 36 18 Handler und Chains-Konzept [2] Axis Engine from client to client transport chain global chain service chain Service (a) Axis Engine Caller service chain global chain transport chain to target service from target service (b) (a) Axis Engine auf Seite des Servers (b) Axis Engine auf Seite des Clients Jede Chain kann sowohl im request flow (eingehende Nachrichten) als auch im response flow (ausgehende Nachrichten) verwendet werden. 37 SOAP Nachrichten erstellen Apache Axis erlaubt die Verwendung eines Call-Objekts zur Erstellung und Versendung einer SOAP-Nachricht. public class echoClient { public static void main(String[] args) { try { Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/EchoService")); call.setOperationName("echo"); call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(XMLType.XSD_STRING); Object[] parameters = new String[] { "Hallo Welt" }; Object returnValue = call.invoke((Object[]) parameters); System.out.println(returnValue); } catch (Exception e) { e.printStackTrace(); } } } 38 19 Attachments Es ist auch unter Axis möglich zu einem Call-Objekt Attachments hinzuzufügen: AttachmentPart a = new AttachmentPart(); a.setContentId("Procuration.mp3"); a.setDataHandler(new DataHandler(new URL("file:///d:/Procuration.mp3"))); call.addAttachmentPart(a); 39 Web Service erstellen Folgende Schritte müssen ausgeführt werden, um einen Web Service zu erzeugen: Java Klasse schreiben, die den gewünschten Dienst erbringt, und diese kompilieren WSDD-Datei schreiben Geschriebene Klasse in das Verzeichnis %TOMCAT_HOME%\webapps\axis\WEB-INF\classes kopieren, Service deployen und Tomcat neu starten 40 20 Schritt 1: Java Klasse schreiben package de.fb12.informatik.webservices.server; public class EchoService { public String echo(String input) { return input; } public String getHelloWorld() { return "Hello World!"; } } 41 Schritt 2: WSDD Datei schreiben WSDD (Web Service deployment descriptor) Der deployment descriptor gibt die Informationen an, die in die Tomcat Konfiguration eingetragen werden sollen. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="EchoService" provider="java:RPC"> <parameter name="className" value="de.fb12.informatik.webservices.server.EchoService"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 42 21 Schritt 3: Service deployen Eine Skriptdatei mit den folgenden beiden Befehlen kopiert die Klasse an die richtige Stelle und meldet sie als Dienst beim laufenden Tomcat an. copy de\fb12\informatik\webservices\server\EchoService.class "%TOMCAT_HOME%\webapps\axis\WEBINF\classes\de\fb12\informatik\webservices\server" java org.apache.axis.client.AdminClient deployServer.wsdd %* Nach Ausführung der Skriptdatei muss der Tomcat neu gestartet werden. 43 Handler schreiben Axis ermöglicht die Verwendung selbst geschriebener Handler. Diese können einer Chain durch einen Eintrag in der Datei server-config.wsdd oder durch einen deployment descriptor hinzugefügt werden. Eine Java-Klasse muss das Interface org.apache.axis.Handler implementieren, damit sie als Handler einer Chain hinzugefügt werden kann. Durch die invoke()-Methode wird die Funktionalität des Handlers bestimmt. 44 22 Beispiel-Handler public class AttachmentHandler implements org.apache.axis.Handler { ... public void invoke(MessageContext msgContext) throws AxisFault { try { Message m = msgContext.getCurrentMessage(); Iterator it = m.getAttachments(); while (it.hasNext()) { AttachmentPart a = (AttachmentPart) it.next(); String filename = a.getContentId(); InputStream in = (InputStream) a.getContent(); FileOutputStream fos = new FileOutputStream(new File("e:/temp/" + filename)); byte[] b = new byte[4096]; int n; while ((n = in.read(b)) > 0) { fos.write(b, 0, n); } fos.close(); } } catch (Exception e) { e.printStackTrace(); } } ... } 45 Handler deployen Der Handler muss wiederum an die richtige Stelle kopiert und danach deployt werden. copy de\fb12\informatik\webservices\server\AttachmentHandler.class "%TOMCAT_HOME%\webapps\axis\WEBINF\classes\de\fb12\informatik\webservices\server\" java org.apache.axis.client.AdminClient deployAttachmentHandler.wsdd %* Für den AttachmentHandler ist dies durch folgenden deployment descriptor möglich: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <handler name="attachmentHandler" type= "java:de.fb12.informatik.webservices.server.AttachmentHandler"/> </deployment> 46 23 Service deployen Jeder Service, der den Handler benutzen soll, muss diesen in seinen request flow oder response flow eingetragen bekommen. Dies ist durch folgenden deployment descriptor möglich: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="EchoService2" provider="java:RPC"> <parameter name="className" value="de.fb12.informatik.webservices.server.EchoService"/> <parameter name="allowedMethods" value="*"/> <requestFlow> <handler type="attachmentHandler"/> </requestFlow> <responseFlow> </responseFlow> </service> </deployment> Danach muss Tomcat neu gestartet werden. 47 server-config.wsdd In dem Verzeichnis %TOMCAT_HOME%\Tomcat5.5\webapps\axis\WEB-INF findet sich die Datei server-config-wsdd. Diese Datei konfiguriert die einzelnen Chains für den Tomcat Server und ist in vier Teile eingeteilt: Globale Konfiguration Handler Services Transport 48 24 Global Configuration <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> ... <parameter name="attachments.Directory" value="e:\temp\attachments"/> <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/> ... <requestFlow> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session"/> </handler> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request"/> <parameter name="extension" value=".jwr"/> </handler> </requestFlow> </globalConfiguration> 49 Handlers and Services <handler name="halloHandler" type="java:HalloHandler"/> <handler name="attachmentHandler" type="java:de.fb12.informatik.webservices.server.AttachmentHandler"/> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <service name="AdminService" provider="java:MSG"> <parameter name="allowedMethods" value="AdminService"/> <parameter name="enableRemoteAdmin" value="false"/> <parameter name="className" value="org.apache.axis.utils.Admin"/> <namespace>http://xml.apache.org/axis/wsdd/</namespace> </service> ... <service name="EchoService2" provider="java:RPC"> <requestFlow> <handler type="attachmentHandler"/> </requestFlow> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="de.fb12.informatik.webservices.server.EchoService"/> </service> 50 25 Transport <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> ... </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment> 51 Literatur SOAP Tutorial: http://www.w3schools.com/soap/ SwA: http://www.w3.org/TR/SOAP-attachments Apache Axis: http://ws.apache.org/axis/ Graham, Davis, et al.: Building Web Services with Java 52 26