Announcement

Collapse
No announcement yet.

Soap Message am Webservice abfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Soap Message am Webservice abfragen

    Hallo,

    Ich ärgere mich jetzt seit mehren Tagen mit SOAP rum. Sämtliche Foren und Bücher die ich bisher durchforstet habe halfen mir nicht weiter. Vielleicht stelle ich mich auch einfach nur blöd an...

    Ich muss einen Webservice schreiben der eine SOAP Nachricht übergeben bekommt. Die sieht in etwa so aus:
    ------=_Part_0_23641627.1164210640313
    Content-Type: text/xml; charset=UTF-8
    Content-Transfer-Encoding: binary
    Content-Id: <7E4E070B032D5994F858AA42F62BFD3C>

    <?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><Formulardaten xmlns=""><Benutzer xmlns=""></Benutzer><ofsXX1_knr_std xmlns=""></ofsXX1_knr_std><b12c96nfBehoerde_Amt xmlns=""></b12c96nfBehoerde_Amt><b12c96nfBehoerde_Strasse xmlns=""></b12c96nfBehoerde_Strasse><b12c96nfBehoerde_PLZ_Ort xmlns=""></b12c96nfBehoerde_PLZ_Ort><b12c96nfBehoerde_Sachbea rbeiter_Name xmlns=""></b12c96nfBehoerde_Sachbearbeiter_Name><b12c96nfSach bearbeiter_Zimmernummer xmlns=""></b12c96nfSachbearbeiter_Zimmernummer><b12c96nfSachb earbeiter_Telefon xmlns=""></b12c96nfSachbearbeiter_Telefon><b12c96nfSachbearbe iter_Telefax xmlns=""></b12c96nfSachbearbeiter_Telefax><b12c96nfSachbearbe iter_E_Mail xmlns=""></b12c96nfSachbearbeiter_E_Mail><b12c96nfAntragstell er_Name xmlns="">Lindauer, Sebastian</b12c96nfAntragsteller_Name><b12c96nfAntragsteller_ Vorname xmlns=""></b12c96nfAntragsteller_Vorname><b12c96nfAntragstell er_Strasse xmlns="">Winzerstraße 54</b12c96nfAntragsteller_Strasse><b12c96nfAntragstell er_PLZ xmlns="">75217</b12c96nfAntragsteller_PLZ><b12c96nfAntragsteller_O rt xmlns="">Birkenfeld</b12c96nfAntragsteller_Ort><b12c96nfAntragsteller_E _Mail xmlns="">[email protected]</b12c96nfAntragsteller_E_Mail><b12c96nfAntragstelle r_Telefon xmlns=""></b12c96nfAntragsteller_Telefon><b12c96nfAntragstell er_Fax xmlns=""></b12c96nfAntragsteller_Fax></Formulardaten></soapenv:Body></soapenv:Envelope>
    ------=_Part_0_23641627.1164210640313
    Content-Type: application/pdf
    Content-Transfer-Encoding: binary
    Content-Id: <AE6A46625725C53EF70207E4D8E9277B>

    %PDF-1.4
    %âãÏÓ
    1 0 obj <</Filter/DCTDecode/Type/XObject/Length 11581/BitsPerComponent 8/Height 400/ColorSpace/DeviceRGB/Subtype/Image/Width 131>>stream
    ÿØÿà JFIF  d d ÿì Ducky   4 ÿî Adobe dÀ ÿÛ „  
    usw...

    Egal was ich anstelle, ich kann auf diese Nachricht nicht zugreifen. Sobald ich den Datentyp des übergebenen Parameters auf SoapMessage setze läuft der Webservice nicht mehr. Und bringt die für mich nichts sagende Fehlermeldung: Member System.Exception.Data vom Typ System.Collections.IDictionary kann nicht serialisiert werden, da es IDictionary implementiert.

    Ich komm hier einfach nicht weiter...

    Mein Webservice sieht momentan so aus:

    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.ComponentModel

    <System.Web.Services.WebService(Namespace:="http ://lk-to-ccdms.de/")> _
    <System.Web.Services.WebServiceBinding(ConformsTo: =WsiProfiles.BasicProfile1_1)> _
    <ToolboxItem(False)> _
    Public Class Service1
    Inherits System.Web.Services.Protocols.SoapHttpClientProtoc ol



    <WebMethod()> _
    Public Function Get_Soap(ByVal message As SoapMessage)
    Dim new_message As String
    new_message = message.ToString()
    My.Computer.FileSystem.WriteAllText("c:\temp\test. txt", new_message, False)
    Return Nothing
    End Function

    End Class

    Ich will erstmal irgendwas auf dem Webservice kriegen. Die ankommende Soapmessage soll dann auseinandergenommen werden in die einzelnen übergeben Parameter und die Anhänge.

    Ich habe auch eine Lösung als Javawebservice vorliegen, aber es muss zwingend ein .Net Webservice sein.

    Funktionierendes Beispiel Java:

    package de.formsolutions.interfaces.webservice;

    import java.io.File;
    import java.util.Iterator;

    import javax.activation.DataHandler;
    import javax.xml.messaging.JAXMServlet;
    import javax.xml.messaging.ReqRespListener;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;

    import org.apache.axis.attachments.AttachmentPart;

    import com.burg.ofs2.tools.PathsObject;

    public class WebServiceReceiver extends JAXMServlet implements ReqRespListener {

    /**
    * Irgendeine ID - nicht benutzt
    */
    private static final long serialVersionUID = 1L;

    public SOAPMessage onMessage(SOAPMessage message) {

    int atts = message.countAttachments();

    System.out.println("***********");
    System.out.println("Es sind " + atts + " Attachments angehänt!");
    System.out.println("***********");

    Iterator it = message.getAttachments();

    usw...

    Ich habe echt keine Idee mehr...

  • #2
    Hallo,

    Ich habe echt keine Idee mehr...
    die Ursache für das Problem liegt darin, dass der Lösungsversuch am falschen Ende beginnt. Da der Webservice mit einer bereits feststehenden XML-Datenstruktur umgehen muss, führt der so genannten Contract First-Weg zum Ziel:
    1. Das XML Schema (XSD) für die Definition der XML-Datenstruktur besorgen.
    2. Das Kommandozeilentool XSD.EXE aus dem .NET Framework erzeugt aus dem XML-Schema eine C#-Klasse, die sich intern über System.Xml.Serialization.XmlTypeAttribute um den Zugriff auf die einzelnen Elemente der XML-Struktur kümmert.
    3. Die von XSD.EXE generierte Klasse muss nun so erweitert werden, dass am Ende eine abstrakte Basisklasse für den zu erstellenden Web Service vorliegt (d.h. die Klasse erbt von System.Web.Services.WebService). Dazu werden auch die Methoden hinzugefügt, die der Client später aufrufen soll.
    4. Der Web Service implementiert die abstrakten Methoden der Basisklasse

    Das Ergebnis sieht dann am Ende so aus, der Parameter sowie der Rückgabewert sind typisiert:

    Code:
    [WebMethod()]
    [SoapDocumentMethod(RequestNamespace = "http://ak.local/schemas/ContractFirst/", 
     ResponseNamespace="http://ak.local/schemas/ContractFirst/", 
     Use=SoapBindingUse.Literal, 
     ParameterStyle=SoapParameterStyle.Bare)] 
    [return: XmlElement("OSDaten", 
     Namespace = "http://ak.local/schemas/ContractFirst/")] 
    public override OSDatenOut DoWork(OSDatenIn aKunde)
    {
    	OSDatenOut aTmpObj = new OSDatenOut();
    	aTmpObj.Kontonummer = aKunde.Kontonummer;
    	aTmpObj.Kontostand = 123.45M;
    	aTmpObj.Buchungstag = DateTime.Now; 
    	return aTmpObj;
    }

    Comment

    Working...
    X