Christian Zeiler, Patrick Schweizer



Ähnliche Dokumente
Wiederholung: Beginn

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

Aus unserer Projekt- und Schulungserfahrung Oracle TechNet

Programmers Manual Geodaten Ver. 2.0

Zertifikate Swiss Government SSL CA 01

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Norm 230 Übertragung von Dateien

ROFIN App Benutzerhandbuch. Version 1.0

Installations Guide für YAJSW und DTLDAP

WebService in Java SE und EE

Themen. Web Service - Clients. Kommunikation zw. Web Services

Key Recovery von Klasse C Enterprise Encryption Zertifikaten mit Certificate Lifecycle Manager

WSDL. Web Services Description Language. André Vorbach. André Vorbach

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

CMS.R. Bedienungsanleitung. Modul Cron. Copyright CMS.R Revision 1

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Verteilte Systeme: Übung 4

Electronic Systems GmbH & Co. KG

Anleitung über den Umgang mit Schildern

Massenversand Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Web Services Security

Arcavis Backend - Invoice Baldegger+Sortec AG

Anwendungsprotokolle: HTTP, POP, SMTP

Workflow, Business Process Management, 4.Teil

Schlüsselaustausch. Version 1.1. APCS Power Clearing and Settlement AG

Vorgehensweise bei Lastschriftverfahren

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Anwendungsbeispiele Sign Live! Secure Mail Gateway

ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg Weiterstadt

GS-Buchhalter/GS-Office 2015 Saldovorträge in folgenden Wirtschaftsjahren erfassen

Häufig gestellte Fragen

Microsoft.NET & IBM System i - Webanwendungen und Webservices II Christian Neißl,

Technical Note 0201 Gateway

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Benutzerhandbuch für die Verwendung des viavac HL7 Forcast Webservices (VAC-CDSS)

Microsoft Access 2010 Navigationsformular (Musterlösung)

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

SDK zur CRM-Word-Schnittstelle

WPF Steuerelemente Listbox, ComboBox, ListView,

:: Anleitung Hosting Server 1cloud.ch ::

teamsync Kurzanleitung

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

Unsere Webapplikation erweitern

Zustandsgebundene Webservices

Mobile Anwendungen Google Cloud Messaging

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Software- Handbuch

Kurzeinführung Excel2App. Version 1.0.0

Auszug aus JAX-WS Folien

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Folgende Voraussetzungen für die Konfiguration müssen erfüllt sein: - Ein Bootimage ab Version Optional einen DHCP Server.

goalio Documentation Release goalio UG

Norman Security Portal - Quickstart Guide

Synchronisations- Assistent

Gezielt über Folien hinweg springen

Dokumentation zur Versendung der Statistik Daten

Angewandte Softwareentwicklung Serialisierung

Das Seminar ist eine Prüfungsleistung für Bachelor und Masterstudierende der Informatik!

Raiffeisen-Volksbank Wemding eg

SMS-Dienst SMS-Dienst procar informatik AG Stand: FS 04/2011 Eschenweg Weiterstadt 1

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Zählen von Objekten einer bestimmten Klasse

Profi cash (Version 10.3 oder höher) Erfassen und Verwalten von SEPA- Lastschriften

DB Restore mit SQL Server7

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang Effretikon

MMS - Update auf Version 4.4

Erste Schritte ANLEITUNG Deutsche Sportausweis Vereinsverwaltung Schnittstelle zum Portal des Deutschen Sportausweises unter

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

STORES2. Operation Manual Version Warenretoure mit Zustimmung des Headquarter

Internet online Update (Mozilla Firefox)

Pfötchenhoffung e.v. Tier Manager

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager -rückläufer Script. combit GmbH Untere Laube Konstanz

LineQuest-Leitfaden LineQuest Dialog-Portal. Generieren der LineQuest-Auswertungsdatei

Anmelden und Vorträge einreichen auf der JBFOne-Website Inhalt

SUB-ID- VERWALTUNG MIT GPP SETUP-GUIDE FÜR PUBLISHER

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw,

Externe Abfrage von für Benutzer der HSA über Mozilla-Thunderbird

pr[sms] MMS-MM7/SOAP Schnittstelle Version: 1.1 Stand: Autor: Gollob Florian

Anleitung SEPA-Lastschriften mit VR- NetWorld Software 5

Da die Bedienung des Editors viele Möglichkeiten aufweist, aber auch etwas Übung voraussetzt, haben wir ihm ein eigenes Unterkapitel gewidmet.

Ihr Benutzerhandbuch AVIRA ANTIVIR EXCHANGE

Shopz Zugang Neuanmeldung

Arbeiten mit Workflows Installationsleitfaden Zur Installation des d3 Workflows

How-To-Do. Fernwartung einer VIPA Steuerung via Ethernet

Dokumentation zeitgesteuerter -Versand mit Attachments. zum Projekt. Deutsche Gesellschaft für Zahn-, Mund- und Kieferheilkunde

Visual Basic Express erstes Projekt anlegen

In der untenstehenden Tabelle finden Sie eine Beschreibung der Symbole, die in dieser Support Note verwendet werden.

Anleitung zu GermanLegal 1.3

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

teischl.com Software Design & Services e.u. office@teischl.com

Anleitung SEPA-Lastschriften mit VR-NetWorld Software 5

Anleitung zur Installation von PGP auf MacOSx

Elexis-BlueEvidence-Connector

OP-LOG

Lehrer: Einschreibemethoden

Outlook Web App Kurzanleitung. Zürich, 09. Februar Eine Dienstabteilung des Finanzdepartements

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Handbuch für Redakteure

Transkript:

Eidgenössisches Finanzdepartement EFD Bundesamt für Informatik und Telekommunikation BIT Lösungszentrum Christian Zeiler e-dec Web Services Best Practice WS-Stacks Projektname: e-dec Version: 0.4 Datum: 2010-06-01 Status in Arbeit in Prüfung genehmigt zur Nutzung Beteiligter Personenkreis Autoren: Genehmigung: Benützer/Anwender: zur Information/Kenntnis: Christian Zeiler, Patrick Schweizer PL Projektgruppe, Zollkunden Projektgruppe Änderungskontrolle, Prüfung, Genehmigung Wann Version Wer Beschreibung 22.10.08 0.1 cze Grundversion 22.01.09 0.1 mru C# Teil wurde hinzugefügt 29.01.09 0.3 pas AXIS2 Teil hinzugefügt 03.05.10 0.4 cze Kapitel 2.7 erstellt

Inhaltsverzeichnis 1 Einleitung...3 1.1 Referenzen...3 2 JAX-WS...4 2.1 Links...4 2.2 Generierung der Stub Klassen...4 2.3 Endpoint Adresse definieren...5 2.4 Http Header...5 2.5 Holder Objekte für Attachments...5 2.6 Monitoring von Request/Response Daten...6 2.7 Bekannte Probleme...6 2.7.1 Signaturprüfung mit JAX-WS Handler Implementation...6 3 CXF...9 3.1 Links...9 3.2 Generierung der Stub Klassen...9 4 Apache AXIS2...10 4.1 Links...10 4.2 Http Header...10 5 C#...11 5.1 Links...11 5.2 Marshalling / Unmarshalling in C#...11 5.3 SOAP Request versenden...11 5.4 SOAP Request empfangen...12 5.5 SOAP Reuqest und Attachment extrahieren...14 5.6 Client Zertifikat...14 6 Tools...15 6.1 Monitoring...15 2/15

1 Einleitung In diesem Dokument werden die Erfahrungen und Best Practices mit den verschiedenen Web Service Stacks dokumentiert. Die Erfahrungen pro Web Service Stack werden jeweils in einem eigenen Kapitel aufgeführt. 1.1 Referenzen Die folgenden Quellen werden im Dokument referenziert oder haben als Grundlage gedient: Ref Titel Version [1] Eclipse Projekt JAX-WS Client: edec_wsclient_jaxws - [2] Viusal Studio Express 2008 Projekt: edec_wsclient_csharp - 3/15

2 JAX-WS Bei JAX-WS handelt es sich um eine Spezifikation die im JSR 224 beschrieben wird. Als Implementierung des JSR 224 wird die Referenzimplementierung von Sun verwendet. Die beschriebenen Erfahrungen beziehen sich auf die Version 2.1.3 der Referenzimplementation. Der Sourcecode stammt aus dem Eclipse Projekt für JAX-WS [1]. 2.1 Links Die folgenden Links enthalten Informationen zu JAX-WS: JSR 224 - http://jcp.org/en/jsr/detail?id=224 JAX-WS RI - https://jax-ws.dev.java.net/ JAX-WS UserGuide - https://jax-ws.dev.java.net/guide/ 2.2 Generierung der Stub Klassen Beim Generieren der Stub Klassen müssen die extension von JAX-WS verwendet werden damit die Klassen generiert werden. Die Extension können via Konsole oder über den Ant- Task definiert werden. <target name="create.stub" depends="clean"> <wsimport sourcedestdir="${prod.source.dir}" destdir="${build.classes.dir}" debug="true" verbose="true" extension="true" wsdl="${wsdl.dir}/${wsdl.file}.wsdl"/> </target> Als Alternative zu den JAX-WS Extension können auch die Namen der Response-Messages umbenannt werden. Details dazu befinden sich im Kapitel 3.2. 4/15

2.3 Endpoint Adresse definieren Der Endpoint für den Web Service kann über das BindingProvider Interface gesetzt werden. ((BindingProvider) port).getrequestcontext().put(bindingprovider.endpoint_address_property, "http://<host>/<service-url>"); 2.4 Http Header Http Header können über das BindingProvider Interface gesetzt werden. Dafür muss eine Map mit einer Liste von Werten erzeugt werden, die anschliessend in den RequestContext eingefügt werden. Map<String, List<String>> headers = new HashMap<String, List<String>>(); List<String> values = new ArrayList<String>(); values.add("<key>"); headers.put("<value>", values); ((BindingProvider) port).getrequestcontext().put(messagecontext.http_request_headers, headers); 2.5 Holder Objekte für Attachments Die Daten der Holder Objekte werden mit dem Encoding BASE64 zurückgeliefert und müssen vor dem Schreiben auf die Festplatte konvertiert werden. Für die Konvertierung kann die Klasse org.apache.commons.codec.binary.base64 verwendet werden. Die Klasse ist Teil des Projekts Apache Commons Codec ( http://commons.apache.org/codec/ ). out = new FileOutputStream(file); Base64 decoder = new Base64(); byte[] decoded_data = decoder.decode(data); out.write(decoded_data); out.flush(); out.close(); 5/15

2.6 Monitoring von Request/Response Daten JAX-WS bietet die Möglichkeit über eine Systemparameter die Ausgabe der Request/Response Daten in der Konsole zu steuern. com.sun.xml.ws.transport.http.client.httptransportpipe.dump=true Als Alternative können auch die beiden Tools TCP Monitor oder WSMonitor verwendet werden. Die beiden Tools werden als Proxy zwischen dem Client und dem Server geschaltet. 2.7 Bekannte Probleme 2.7.1 Signaturprüfung mit JAX-WS Handler Implementation In der aktuellen Version wird die Payload des SOAP-Responses inkl. dem Body-Tag signiert. Bei der Verwendung von JAX-WS Handlern bei der Überprüfung der Signatur gibt es Probleme weil der DOM-Tree von der Standard-Implementation verändert wird. 2.7.1.1 Vorgehen Fehleranalyse Die folgenden Kapitel beschreiben das Vorgehen bei der Fehleranalyse. HTTP-Dump erstellen Mit dem Parameter aus Kapitel 2.6 kann ein Dump des HTTP-Responses erstellt werden. Dieser Dump enthält die Daten wie sie über das Protokoll geliefert werden. Zeilenumbruch und zwei Leerschläge zw. <SOAP-ENV:Body..> und <ns1:receiptrequestresponse..> <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open...> <ns1:receiptrequestresponse xmlns:ns1="http://www.edec.ch/xml/schema/edecreceiptresponse/v1" xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" schemaversion="0.6" xsi:schemalocation="http://www.edec.ch/xml/schema/edecreceiptresponse/v1 http://www.ezv.admin.ch/pdf_linker.php?doc=edecreceiptresponse_v_0_6"> <requestortraderidentificationnumber xmlns="http://www.edec.ch/xml/schema/edecreceiptresponse/v1">1000029</requestortraderidentificationnumber> Zeilenumbruch und ein Leerschlag zw. </ns1:receiptrequestresponse> und </SOAP- ENV:Body> </ns1:receiptrequestresponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> DOM-Tree Dump erstellen Mit dem folgenden Code kann ein Dump des DOM-Trees erstellt werden. SOAPEnvelope envelope = smc.getmessage().getsoappart().getenvelope(); try{ // Set up the output transformer TransformerFactory transfac = TransformerFactory.newInstance(); Transformer trans = transfac.newtransformer(); trans.setoutputproperty(outputkeys.omit_xml_declaration, "no"); trans.setoutputproperty(outputkeys.encoding, "UTF-8"); trans.setoutputproperty(outputkeys.indent, "no"); // Print the DOM node StringWriter sw = new StringWriter(); StreamResult result = new StreamResult(sw); 6/15

DOMSource source = new DOMSource(envelope); trans.transform(source, result); String xmlstring = sw.tostring(); System.out.println("DOM Begin"); System.out.println("-------------------------------------------"); System.out.print(xmlString); System.out.println("-------------------------------------------"); System.out.println("DOM End"); } catch (TransformerException e){ e.printstacktrace(); } Debugdetails der Variablen envelope: Das firstchild ist der Header (rot). Sein nextsibling ist der Body (rot). Das firstchild des Body ist der receiptrequestresponse (grün). Es fehlt eine TextNode mit dem Zeilenumbruch und den beiden Leerschlägen. Das firstchild von receiptrequestresponse ist eine TextNode mit einem Zeilenumbruch und drei Leerschlägen (blau) - was auch korrekt ist. Im Envelope werden beim Header und Body immer alle Leerschläge und Zeilenumbrüche entfernt bis zum ersten SubElement. Unterhalb dieser SubElemente sind alle Leerschläge und Zeilenumbrüche vorhanden. 7/15

DOM-Ausgaben auf der Konsole: Bei der Ausgabe des DOM s werden keine Leerschläge oder Zeilenumbrüche zwischen Body und receiptrequestresponse eingefügt. <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurityutility-1.0.xsd" wsu:id="id-16340840"><ns1:receiptrequestresponse xmlns:ns1="http://www.edec.ch/xml/schema/edecreceiptresponse/v1" xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" schemaversion="0.6" xsi:schemalocation="http://www.edec.ch/xml/schema/edecreceiptresponse/v1 http://www.ezv.admin.ch/pdf_linker.php?doc=edecreceiptresponse_v_0_6"> <requestortraderidentificationnumber xmlns="http://www.edec.ch/xml/schema/edecreceiptresponse/v1">1000029</requestortraderidentificationnumber> 2.7.1.2 Fazit Das XML aus dem HHTP-Dump kann fehlerfrei validiert werden. Der Zugriff über den Envelope gibt einen bereits modifizierten DOM zurück. Mit diesem Ansatz ist es nicht möglich den Original Response (siehe http-dump) auszulesen. Die Validierung des DOM-Outputs schlägt fehl. 2.7.1.3 Alternative Implementation: Als Alternative zu JAX-WS und Handler könnte die Abfrage via createdispatch() des Services durchgeführt werden Details siehe: http://blogs.sun.com/artf/entry/operating_at_the_xml_message Diese Variante wurde noch nicht getestet 8/15

3 CXF Bei CXF handelt es sich um einen Web Service Stack von Apache. 3.1 Links Die folgenden Links enthalten Informationen zu CXF: Projekt Webseite - http://cxf.apache.org/ 3.2 Generierung der Stub Klassen Damit die Klassen mit CXF generiert werden können müssen bei den multipart - Operationen die Namen der Antwort-Parts in den Messages und Bindings umbenannt werden. (z.b. parameters result). <message name="goodsdeclarationsresponse"> <part name="result" element="edecresponse:goodsdeclarationsresponse"/> </message> <binding name="edecbinding" type="tns:edecporttype"> <output> <mime:multipartrelated> <mime:part> <soap:body use="literal" parts="result"/> </mime:part> </mime:multipartrelated> </output> 9/15

4 Apache AXIS2 Bei AXIS2 handelt es sich um einen Web Service Stack von Apache. 4.1 Links Die folgenden Links enthalten Informationen zu AXIS2: Projekt Webseite http://ws.apache.org/axis2/ SOAP with Attachments mit apache AXIS2: http://thilinag.blogspot.com/2007/05/using-soap-with-attachments-in-axis2.html http://wso2.org/library/1148 4.2 Http Header Http Header können über die Options Klasse gesetzt werden. Dafür muss eine ArrayList angelegt werden, welcher anschliessend Objekte vom Typ Header hinzugefügt werden können. EdecServiceStub stub = new EdecServiceStub(EDEC_SERVICE_URL); Options options = stub._getserviceclient().getoptions(); List http_headers = new ArrayList(); http_headers.add(new Header("SSL_CLIENT_CERT_S_DN_CN", "Firma xy ABCDEF")); options.setproperty(httpconstants.http_headers, http_headers); 10/15

5 C# Mit C# gab es einige Problem, da weder mit WCF (Svcutil.exe) oder mit dem Tool Wsdl.exe einen brauchbaren Web Service Client Stub generiert werden konnte. Auch durch das modifizieren des WSDL (entfernen der SwA spezifischen Einträge) konnte auch kein brauchbaren Stub erstellt werden. Eines der Probleme ist das, dass.net Framework kein SwA (SOAP Messages with Attachments) unterstützt. Deshalb wurde ein C# Client erstellt der selber ein SOAP Request zusammenstellt und mit dem MIME Parser SharpMimeTools die Attachments extrahiert. Nachfolgend sind die wichtigsten Schritte dokumentiert. Eine Beispiel Applikation wurde mit C# Visual Studio Express 2008 erstellt. 5.1 Links Die folgenden Links enthalten zusätzliche Informationen:.Net Framework - http://www.microsoft.de/net Visual Studio Express http://www.microsoft.com/express/ SharpMimeTools - http://anmar.eu.org/projects/sharpmimetools/ 5.2 Marshalling / Unmarshalling in C# Mit dem Programm Xsd.exe kann man aus den Schemas C# Klassen generieren. Die erstellten C# Klassen können dann mit dem XmlSerializer serialisiert oder deserialisiert werden. Xsd.exe edec_v_2_0.xsd edecselectionandtransit_v_1_0.xsd edecresponse_v_2_0.xsd /c /o:c:\out Durch den Parameter /o wird angegeben wohin die generierten Klassen kopiert werden sollen. 5.3 SOAP Request versenden Mit dem XmlSerializer kann man nun die Objekte in XML deserialisieren. Danach muss man nur noch die SOAP Spezifischen Elemente (SOAP Envelope, SOAP Body und SOAP Header) hinzufügen und mittels der Klasse HttpWebRequest an die entsprechenden Endpoint URL versenden. FileStream fs = new FileStream( C:\data\export.xml, FileMode.Open); XmlSerializer serializer = new XmlSerializer(typeof(goodsDeclarations)); goodsdeclarations declarations = (goodsdeclarations) serializerreq.deserialize(fs); 11/15

// here you could modify goodsdeclarations XmlWriterSettings writersettings = new XmlWriterSettings(); writersettings.omitxmldeclaration = true; StringWriter stringwriter = new StringWriter(); using (XmlWriter xmlwriter = XmlWriter.Create(stringWriter, writersettings)) { } serializerreq.serialize(xmlwriter, declarations); string xmltext = stringwriter.tostring(); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.contenttype = @"text/xml;charset=""utf-8"""; req.accept = "text.xml"; req.method = "POST"; // create soap message (with SOAP Header, Body and Envelope) String msg = START_MSG + xmltext + END_MSG; byte[] reqbytes = System.Text.Encoding.UTF8.GetBytes(msg); req.contentlength = reqbytes.length; Stream reqstream = req.getrequeststream(); // send soap request reqstream.write(reqbytes, 0, reqbytes.length); reqstream.close(); 5.4 SOAP Request empfangen Das Problem beim Request ist, dass wir eine MIME Multipart Response erhalten. Mit der Library SharpMimeTools kann man den Response Stream einer HttpWebResponse parsen. Der Response Stream sieht wie folgt aus. ------=_Part_118_24290992.1232636587322 12/15

Content-Type: text/xml Content-Description: e-dec_export_edecresponse_524536839_09chee000000507663_1_1000054_1 Content-ID: <parameters=-15248ca1:11efdd317b9:-7cc2_0@edec.ezv.admin.ch> <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> </ > ------=_Part_118_24290992.1232636587322 Content-Type: application/pdf Content-Transfer-Encoding: base64 Content-Description: e-dec_export_al_524536839_09chee000000507663_1_1000054_1 Content-ID: <e-dec_export_al=-15248ca1:11efdd317b9:-7cc3_1@edec.ezv.admin.ch> JVBERi0xLjQKJeLjz9MKOCAwIG9iaiA8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDgzOT4+ ------=_Part_118_24290992.1232636587322-- Damit der Response Stream der HttpWebResponse Klasse MIME konform ist, muss man noch einige MIME Headers hinzufügen (Date, Content-Type und Content-Length). Diese erhält man aus den HTTP Header der HttpWebResponse. Date: Thu, 22 Jan 2009 15:03:04 GMT Content-Type: multipart/related; boundary="----=_part_118_24290992.1232636587322" Content-Length: 7732 Anschliessend kann man den Request Stream mit der Klasse SharpMessage, aus der Library, MimeSharpTools parsen. HttpWebResponse res = ; MemoryStream httpstream = ; MemoryStream mimestream = ; Encoding utf8 = Encoding.UTF8; TextReader readerreq = new StreamReader(httpStream, utf8); TextWriter writer = new StreamWriter(mimeStream, utf8); // create a correct mime stream form the HttpResponseStream // add http headers which were required for a correct mime // format writer.writeline("date: " + res.getresponseheader("date")); writer.writeline("content-type: " + res.contenttype); writer.writeline("content-length: " + res.contentlength); writer.writeline(environment.newline); // copy rest of the stream while (true) { string line = readerreq.readline(); if (line == null) 13/15

{ break; } writer.writeline(line); } writer.flush(); mimestream.position = 0; // parse the stream for mime attachments SharpMessage message = new SharpMessage(mimeStream, SharpDecodeOptions.Default SharpDecodeOptions.DecodeTnef SharpDecodeOptions.UuDecode); 5.5 SOAP Reuqest und Attachment extrahieren Auf Sämtliche Daten (SOAP Response und Attachments) kann man mittels der Klasse SharpMessage zugreifen. SharpMessage message = ; if (message.attachments!= null) { foreach (attachment in message.attachments) { Stream stream = attachment.stream; } 5.6 Client Zertifikat Unter der folgenden Microsoft Support Seite wird erklärt, wie man einem WebRequest ein Client Zertifikat mitgeben kann. http://support.microsoft.com/kb/895971 14/15

6 Tools 6.1 Monitoring Name TCP Monitor WSMonitor Link https://tcpmon.dev.java.net/ https://wsmonitor.dev.java.net/ 15/15