Laden...

xml datei per soap übertragen

Erstellt von jollex vor 19 Jahren Letzter Beitrag vor 19 Jahren 19.541 Views
J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren
xml datei per soap übertragen

Hallo,
kann mir bitte jemand einen Tip geben wie ich eine xml Datei
mittels soap übertragen kann? ich habe leider noch keine grosse Erfahrung
in diesem Gebiet, habe aber grossen Zeitdruck..

Wäre eine Möglichkeit den HTTP Header und den soap Nachricht in einen string zu
packen und dann zu übertragen??

Oder muss die Nachricht eingelesen und codiert werden?
Mit XmlSerialize??

Habe leider im Netz auch keine entsrechenden Dokumente bzw. Tutorials gefunden.

Bin für jeden Tip dankbar..

F
10.010 Beiträge seit 2004
vor 19 Jahren

Was willst Du denn überhaupt machen?

SOAP ist ein Protokoll, das u.a. standartmässig von .NET-Webservices
"gesprochen" wird.

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

also ich möchte xml daten in eine datenbank schreiben..
das klappt ja soweit ganz gut über dataset und datagrid...
aber wenn ich mir die xml datei anschaue fehlt der soap header und der http request und das ganze zeugs , wie kann ich das denn anhängen...

ich habe mal das bsp der msdn exemplarisches vorgehen zur erstellung von verteilten anwendungen mit asp werbdienst und asp webanwendung durchgespielt...

F
10.010 Beiträge seit 2004
vor 19 Jahren

Wenn Du diese SOAP-Nachricht an einen WebService schickst,
dann nimmt der WebService den SOAP-Header und interpretiert ihn.

Der braucht das um zu erkennen, was wie gemacht werden soll.

Danach ist der SOAP-Header Weg.

Was ist da auf der anderen Seite?
Ein .NET Webservice?

Dann ist die ganze Sache doch viel einfacher.

Webservice in VS.NET Referenzieren, und dann einfach die
Daten als Funktionsparameter übergeben.

Aber wenn Du eine ausführlichere Antwort haben möchtest,
musst Du auch mehr Angaben machen.
Wir wissen hier nicht was Du gerade machst, wie das
Drumherum aussieht, was rein und rausgeht.

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

hi, sorry das ich erst so spät schreibe, aber ich dachte die 3 Antworten wären die 3 bereits vorhandenen Einträge 🙁

die anwendung auf dem Server wird wohl ein xml- webdienst werden. die aufgabe der anwendung ist die xml datei auszulesen und durch INSERT in eine DB zu schreiben.

wie kann
eine bereits vorhandene xml Datei, welche durch einen separaten mechanismus erstellt wurde, komplett so wie sie ist als nutzlast im Body der soap nachricht übertragen werden etwa so:

<soap umschlag>
<soap header>allerlei Benutzerdaten wie passwörter</soap header>
<soap body>
<?xml version="1.0" encoding="utf-8"?>
<terminplaner xmlns:p="http://www.htw-dresden.de/s4137/person">
<termin>
<absender>
<p:person>
<p:name>Hedler</name>
<p:vorname>Martin</vorname>
<p:datum tag="32" monat="01" jahr="1872" />
</p:person>
</absender>
<text>Vortrag &uuml;ber Web-Services</text>
<datum tag="22" monat="10" jahr="2003" />
</termin>
</terminplaner>
</soap body>
</soap umschlag>

wie bekomme ich die xml datei unverändert vom client zum server.

wenn ich die date als funktionsparameter übertragen lassen würde, müsste ich ja die fertige xml datei deserialisieren und dann wieder serialisieren. das ist doch unfug, oder versteh ich das falsch?

was hat es mit dem http header aufsich? muss der in die soap nachricht?
POST /transactions/AnalysePerson HTTP/1.1
Host: jupiter.test.com.au
Content-Type: application/soap; charset="utf-8"
SOAPAction: "http://saturn.test.com.au/transactions/AnalysePerson"

F
10.010 Beiträge seit 2004
vor 19 Jahren

Ich verstehe das richtig:

Der Webservice ist noch nicht fertig.
Die Daten kommen von einem Client, der Schon vorhandene Daten in
einer XML-Datei hat, die er dann komplett senden will.

Versende Die komplette Datei als einen String.
Kannst Sie auf der anderen Seite dann in ein XmlDocument oder
ähnliches einlesen und verarbeiten.

C
65 Beiträge seit 2004
vor 19 Jahren

Wegen SOAP und Webserver: Einigen Systemen, etwa PHP, muss man erst beibringen, dass sie einen POST-Request komplett als "raw data" behandeln können. Falls Dein Server natürlich ein IIS ist mit .NET, hast Du da keine Probleme. Mir ist es jedenfalls passiert, dass der Server, der den Service bereit stellen sollte, mit einem SOAP-Request nix anzufangen wusste und ich erstmal wegen einer Einstellung (php.ini) mit dem Provider verhandeln musste.

Ansonsten kann ich aus der Praxis nur dringend dazu raten, dass Du Dir FZelles Vorschlag zu Herzen nimmst und Deine Daten in einen einzigen String packst (das könnte dann so ähnlich wie eine CSV-Datei aussehen). Alles andere macht einen tierischen Aufwand, der zudem total überflüssig ist. SOAP an sich ist schon umständlich genug.

/// <summary>
/// Signatur
/// </summary>

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

hi, vielen dank für eure antworten, das mit dem string würde dann so aussehen oder? (is zwar java, aber vom prinzip her )

/* String mit SOAP Nachricht zusammenfuegen */
String s =
"<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>\n" +
"<soap:Envelope\n" +
"xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;>\n" +
"<soap:Body>\n" +
"<getNameByCode xmlns=&quot;java:com.pepperzak.webservices.ecommerce&quot;>\n" +
"<arg0>10070000</arg0>\n" +
"</getNameByCode>\n" +
"</soap:Body>\n" +
"</soap:Envelope>\n";

  /* String fuer HTTP Header zusammenfuegen */  
  String ht =  
  &quot;POST /bankcode/bankcodeuri HTTP/1.1\r\n&quot; +  
  &quot;Host: appserver.pepperzak.net\r\n&quot; +  
  &quot;Content-Type: text/xml; charset=utf-8\r\n&quot; +  
  &quot;Content-Length: &quot; + Integer.toString(s.length()) + &quot;\r\n\r\n&quot;;  

   PrintStream o = new PrintStream(sock.getOutputStream());  
   o.print(ht); // HTTP Header senden  
   o.print(s); // SOAP Nachricht senden  

Is das de einzige Lösung, weil ich in Zahlreichen .NET Büchern und SOAP Büchern nie was drüber gelesen hab mit strings ?( ?(

ja das is n IIS .NET Server.

danke

C
65 Beiträge seit 2004
vor 19 Jahren

äh, ich glaube, wir haben uns missverstanden (jedenfalls du und ich 🙂 ), was das mit den strings betrifft.

dein code sieht erstmal okay aus. ich machs mir persönlich immer leicht dadurch, dass ich den xmlns auf irgendwas eigenes setze, weil es letztlich ja doch nur um das geht, was zwischen <soap:body ...> und </soap:body> steht.

mir ging es um was anderes, nämlich darum, dass du zum beispiel entweder

<soap:body xmlns:m="CP">
   <m:SubmitTicket>
      <m:CustomerID>47110815</m:CustomerID>
      <m:ProductID>12345</m:ProductID>
      <m:Version>2.1</m:Version>
      <m:Timestamp>2004-07-22 15:29:13</m:Timestamp>
      ...
   </m:SubmitTicket>
</soap:body>

oder kürzer

<soap:body xmlns:m="CP">
   <m:SubmitTicket>
      <m:TicketData>47110815;12345;2.1;2004-07-22 15:29:13;...</m:TicketData>
   </m:SubmitTicket>
</soap:body>

schreiben kannst. klar, ein guter XML-parser kann mit der ersten version 1000 tolle sachen anstellen, aber letztlich fummelt man sich seine daten dann doch bloß per parser in eine datenstruktur und friemelt sie dann in eine datarow oder so. und da ist es aus meiner erfahrung einfach praktischer, statt mit 100 tags zu arbeiten, einfach nur eins zu nehmen und das dann kurz und bündig zu verarbeiten. dieses pseudo-CSV-format hat sich bei mir vor allem eben immer dann bewährt, wenn es darum ging, daten in eine datenbank zu stopfen, weil die daten schon fast in datarow-format ankommen.

/// <summary>
/// Signatur
/// </summary>

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

hmm wie sag ichs meinem Kinde 😉 das hab ich auch nich gemeint....
also ich muss nochmal betonen, die XML- Datei liegt bereits komplett vor! Dir Struktur darf unter keinen Umständen verändert werden. Lediglich SOAP- Zusätze wie envelope oer header können hinzugefügt werden.

Ich werds mal abstahieren 8o
Also ich wohn in Berlin und habe eine XML- datei datei.xml diese kopiere ich auf eine proprietäre Diskette und schicke die mit der Post (über Briefkasten und Kouvert) nach München. Dort wird sie vom Empfänger in sein Laufwerk gestopft und liegt genauso vor wie ich se abgeschickt hab..... 🤔

C
65 Beiträge seit 2004
vor 19 Jahren

Wo denn, wo denn? Ah, jetzt ja... 🙂 Dann machs doch einfach so:

<soap:body xmlns:m="jollex">
   <m:TransportXMLFile>
      <m:XMLContent>
{?xml version="1.0" encoding="utf-8"?}
{terminplaner xmlns:p="http://www.htw-dresden.de/s4137/person"}
{termin}
{absender}
{p:person}
{p:name}Hedler{/name}
{p:vorname}Martin{/vorname}
{p:datum tag="32" monat="01" jahr="1872" /}
{/p:person}
{/absender}
{text}Vortrag &uuml;ber Web-Services{/text}
{datum tag="22" monat="10" jahr="2003" /}
{/termin}
{/terminplaner}
      </m:XMLContent>
   </m:TransportXMLFile>
</soap:body>

Dann hast Du Deine XML-Datei so eingepackt, dass der SOAP-Parser die Finger daovn lässt. Du liest dann einfach den XMLContent-Knoten aus, ersetzt die geschweiften wieder durch spitze Klammern und hast eine unangetastete XML-Datei.

/// <summary>
/// Signatur
/// </summary>

C
980 Beiträge seit 2003
vor 19 Jahren

Unterstützt SOAP Keine CDATA Sections?

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

ok, jetzt ist die soap nachricht fein verpackt, ob mit oder ohne CDATA Sections...
Aber wie bekomme ich diese nun an den Server?
Ich muss die ja rgendwie über http versenden können....
Der http header mit der POST Methode und dem SoapAction eintrag ist über der einetlichen xml- Datei eingefügt, und nun????

Vielen Dank für die rege Beteiligung 😁 🙂

J
jollex Themenstarter:in
9 Beiträge seit 2004
vor 19 Jahren

hab ne lösung:

erstelle soap- codierte xml Datei mit Header und Body von Hand
lese Diese mit folgendem Code ein:


XmlDocument doc = new XmlDocument();
doc.Load("C:\\xmldatei.xml");

und sende sie an den Server:

			
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/WebDienstAddition/Service1.asmx");
req.Headers.Add("SOAPAction","\"\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
Stream stm = req.GetRequestStream();
doc.Save(stm);
stm.Close();

Aber da hab ich schon wieder ein Problem -> siehe Netzwerkprogrammierung

Danke nochmal für eure Hilfe, Super Forum!!!

F
10.010 Beiträge seit 2004
vor 19 Jahren

Hab ich jetzt was an den Augen, oder versuchst Du tatsächlich einen
Webservice von Hand zu füttern?

Wofür gibt es in VS.NET den Menüpunkt add WebReference?

Da gibst Du den Webservice an, den Du benutzen willst, und
er wird dir wie eine Normale Klasse eingebunfen und du Rufst dann
nur noch Funktionen auf.

Also warum so umständlich von Hand?