Laden...

SOAP 1.2 Request

Erstellt von ziggyyy vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.402 Views
Z
ziggyyy Themenstarter:in
5 Beiträge seit 2013
vor 11 Jahren
SOAP 1.2 Request

Hallo liebe Community,

ich arbeite derzeit an einem umfangreichen Projekt. Ein Ticketsystem hat eine Soap 1.2 API und darüber können Supporttickets angelegt werden. Warum der ganze Spaß? Eine Automatisierung soll her. Nun bin ich recht neu im Bereich C# und SOAP 1.2.

ich erzeuge erstmal eine XML Datei.

private void create_Incident(string computer_idn, string swidn_choice, string swName_choice)
    {
        XmlDocument xmldoc = new XmlDocument();
        XmlNode newRoot, newNode, newSubNode;

        // Root
        newRoot = xmldoc.CreateElement("vorfall");
        xmldoc.AppendChild(newRoot);

        // Childs
        newNode = xmldoc.CreateElement("msg_id");
        newNode.InnerText = "" + computer_idn + "_" + swidn_choice + "";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("contact");
        newRoot.AppendChild(newNode);

        newSubNode = xmldoc.CreateElement("employee_id");
        newSubNode.InnerText = "" + windows_user + "";
        newNode.AppendChild(newSubNode);

        newNode = xmldoc.CreateElement("status");
        newNode.InnerText = "In Progress";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("state");
        newNode.InnerText = "Unassigned";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("impact");
        newNode.InnerText = "Low";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("urgency");
        newNode.InnerText = "Middle";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("it_short_desc");
        newNode.InnerText = "Software Deployment";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("type");
        newNode.InnerText = "Service Request";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("service");
        newNode.InnerText = "NOT DETERMINDED";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("inquiry_txt");
        newNode.InnerText = "Installation der Software '" + swName_choice + "' auf '" + IV_Number + "'";
        newRoot.AppendChild(newNode);

        newNode = xmldoc.CreateElement("source");
        newNode.InnerText = "Interface";
        newRoot.AppendChild(newNode);

        xmldoc.Save(@"C:\Test_XML\" + computer_idn + "_" + swidn_choice + ".xml");

    }

Nun weiß ich leider nicht, wie ich das schöne Ding an den Server sende. 😕

Ich weiß, dass es ein httpwebrequest eine Sache wäre, die funktionieren kann. Finde aber im Internet gefühlte 1. Mio. andere Ansätze.

POST /iapi/API.asmx HTTP/1.1
Host: host1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Tsystem_InsertIncidentXML xmlns="http://test1.com/webservices/">
      <userName>string</userName>
      <xml>string</xml>
    </Tsystem_InsertIncidentXML>
  </soap12:Body>
</soap12:Envelope>

Laut Doku ist der Username der Name, mit dem ich Tickets im Supportsystem aufmachen kann. Der XML String soll wohl die XML Datei sein, die ich erzeugt habe.

Das System hinterlegt nach Bearbeitungszeit eine Responsedatei mit der eindeutigen msg_id aus der XML, die die Ticketdaten hält. Mit der msg_id soll ich dann die Response XML vom Ticketsystem ansprechen können.
Dort ist in der Doku ebenfalls etwas hinterlegt.

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Tsystem_InsertIncidentXMLResponse xmlns="http://test1.com/webservices/">
      <Tsystem_InsertIncidentXMLResult>int</REMEDY_InsertIncidentXMLResult>
      <msg>string</msg>
    </Tsystem_InsertIncidentXMLResponse>
  </soap12:Body>
</soap12:Envelope>

Kann mir jemand etwas helfen? 😕

LG
Ziggy

16.806 Beiträge seit 2008
vor 11 Jahren

...warum baust Du die XML per Hand und lässt Dir nicht einfach ein C# Objekt nach SOAP serialisieren?
Dafür gibts sogar fertige Frameworkmethoden. Man muss nur in die Doku schauen.

Aber selbst das muss man nicht selbst machen, wenn man einfach die in .NET bereits existierenden SOAP-Schnittstellen nutzt; sowohl fürs Senden wie auch fürs Empfangen.
Google-Suche: "c# soap" => About 8,530,000 results (0.15 seconds) und gleich der erste Treffer verweist auf passendes Beispiel und die Doku.

PS: in der Forenbeschreibung steht, dass SOAP ein Netzwerkthema und kein Web-Thema ist. Daher in die korrekte Kategorie verschoben.
Möchte Dich an [Hinweis] Wie poste ich richtig? 1.1 und 2.1 erinnern bzw aufmerksam machen.

Z
ziggyyy Themenstarter:in
5 Beiträge seit 2013
vor 11 Jahren
Z
ziggyyy Themenstarter:in
5 Beiträge seit 2013
vor 11 Jahren

ich bin froh, dass ich es bis hierhin geschafft habe 😮 jetzt kommst du mit sowas an...bin komplett überfordert. 😦

Z
ziggyyy Themenstarter:in
5 Beiträge seit 2013
vor 11 Jahren

Kann ich das ganze auch mit XElementen lösen?
http://msdn.microsoft.com/de-de/library/vstudio/bb387089.aspx
Ich finde nur nichts wie man das dann an den Server sendet?!

Habe irgendwo im Laufe meiner Recherche etwas gefunden, dass man den httpwebrequest ein String mit dem kompletten soap Inhalt gibt und der den dann an den Server sendet. Frage ist auch, muss ich im Soap den String "xml" als String dort reinschreiben? Oder den Link zur XML Datei, oder ohne String und gleich den Inhalt der XML dort reinschreiben. Tappe noch echt im dunkeln...

Ich verstehe auch irgendwie nicht, warum ich eine XML in einer XML verschicken muss. Was ergibt das denn für ein Sinn?

16.806 Beiträge seit 2008
vor 11 Jahren

Dann lies das Thema SOAP mit C# richtig durch und dann verstehst Du das auch.
Das geht nicht innerhalb einer Stunde. Da wundert mich nicht, dass Du a) SOAP nicht verstehst und b) überfordert bist. Daraus resultiert dann Dein Vorgehen, das einfach mehr als suboptimal ist.

Schaus Dir einfach an und lern es. Das können und werden wir Dir einfach nich abnehmen können.
Gibt zig Tutorials und Dokumentationen. Google liefert hunderte Treffer!

Natürlich kannst Du alles auch anders lösen. Natürlich kannst Du auch auf der Autobahn joggen. Inwiefern das alles sinnvoll ist und dann auch noch sicher ist ne völlig andere Sache.

SOAP ist nen festes Protokoll.
Mach Dir die Mühe und stells mit XElement nach (Hilfe: http://soapclient.com/standards.html und http://www.w3.org/TR/2000/NOTE-SOAP-20000508/) oder lerns und verwend Framework-Methoden.

Z
ziggyyy Themenstarter:in
5 Beiträge seit 2013
vor 11 Jahren

Ok ich habe jetzt einen XMLWriter genommen, der mir immer einen userabhängigen String baut.

    private void create_Incident(string computer_idn, string swidn_choice, string swName_choice, string CI_Number, string windows_user)
    {
        StringBuilder sb = new StringBuilder();
        using (XmlWriter xmlWriter = XmlWriter.Create(sb))
        {
            xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("incident");
                    xmlWriter.WriteStartElement("msg_id", "" + computer_idn + "_" + swidn_choice + "");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("contact");
                    xmlWriter.WriteElementString("employee_id", "" + windows_user + "");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("status", "In Progress");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("state", "Unassigned");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("impact", "5 - BAU");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("urgency", "3 - BAU");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("it_short_desc", "Test: BISS – Software Deployment");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("type", "User Service Request");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("service", "NOT DETERMINDED");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("inquiry_txt", "Test: Installation der Software " + swName_choice + " auf " + CI_Number + "");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("source", "Interface");
                    xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();
            xmlWriter.WriteEndDocument();
            xmlWriter.Close();
        }
        sb.ToString();
        
        string username = "BISS";
        string strReq = @"<?xml version=" + "1.0" + " encoding=" + "utf-8" + "?><soap12:Envelope xmlns:xsi=" + "http://www.w3.org/2001/XMLSchema-instance" + " xmlns:xsd=" + "http://www.w3.org/2001/XMLSchema" + " xmlns:soap12=" + "http://www.w3.org/2003/05/soap-envelope" + "><soap12:Body><REMEDY_InsertIncidentXML xmlns=" + "http://test.com/webservices/" + "><userName>" + username + "</userName><xml>" + sb + "</xml></REMEDY_InsertIncidentXML></soap12:Body></soap12:Envelope>";

        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://servertest/api/");
        req.Method = "POST";
        req.ContentType = "application/soap+xml; charset=utf-8";
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] postBytes = encoding.GetBytes(strReq);
        req.ContentLength = postBytes.Length;

        Stream postStream = req.GetRequestStream();
        postStream.Write(postBytes,0,postBytes.Length);
        postStream.Close();

        HttpWebResponse reqResponse = (HttpWebResponse) req.GetResponse();
        Stream responseStream = reqResponse.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        String strRes = reader.ReadToEnd();
        
        Console.WriteLine("Response: "+strRes);
        reqResponse.Close();

    }

Mein String, den ich in die SoapXML übergebe sieht jetzt nur etwas komisch aus:

<?xml version=1.0 encoding=utf-8?>
<soap12:Envelope xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:soap12=http://www.w3.org/2003/05/soap-envelope>
	<soap12:Body>
		<REMEDY_InsertIncidentXML xmlns=http://test.com/webservices/>
		<userName>BISS</userName>
		<xml><?xml version=\"1.0\" encoding=\"utf-16\"?><incident><msg_id xmlns=\"50889_227\" /><contact><employee_id>fischem</employee_id></contact><status xmlns=\"In Progress\" /><state xmlns=\"Unassigned\" /><impact xmlns=\"5 - BAU\" /><urgency xmlns=\"3 - BAU\" /><it_short_desc xmlns=\"Test: BISS – Software Deployment\" /><type xmlns=\"User Service Request\" /><service xmlns=\"NOT DETERMINDED\" /><inquiry_txt xmlns=\"Test: Installation der Software !!!OLD!!! Kyocera KyoLocalAgent 1.3.8 auf 306524\" /><source xmlns=\"Interface\" /></incident></xml></REMEDY_InsertIncidentXML>
	</soap12:Body>
</soap12:Envelope>"

die Backslahs gehören da vermutlich nicht rein? Oder interpretiert der Server das richtig?
Ich habe gelesen, dass der Host im http header geschützt ist. Muss ich den mitgeben?

UPDATE:
wenn der strReq String erzeugt wird, baut er die backslashes ein. Woran liegt das?