Laden...

WebService Response in Dictionary "einlesen"

Erstellt von Enulien vor 12 Jahren Letzter Beitrag vor 12 Jahren 8.777 Views
E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren
WebService Response in Dictionary "einlesen"

Hi,

ich bin neu hier Forum und auch neu im C# und WebService-Bereich.
Zuerst einmal hoffe ich, dass ich hier im richtigen Unterforum bin.

Jetzt zu meiner Frage:
Ich habe einen WebService, der mir verschiedene Daten zurück liefert.
Hier ist ein Beispiel wie es in Java aussieht.
Das Ganze hätte ich jetzt gerne in C#. Soweit ich es verstanden habe, kann man anstatt der HashMap, die Daten über die Klasse Dictionary einlesen. Wie genau würde da die Syntax aussehen?
Bisher habe ich in Verbindung mit dem Methodenaufruf im eine "Fehler beim Deserialisieren ..." bekommen.
Für Eure Hilfe schon im Voraus vielen Dank.

Grüße
Enulien

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Enulien, willkommen im Forum,

nach dem Verschieben bist du jetzt auch im richtigen Unterforum 😉

Soweit ich es verstanden habe, kann man anstatt der HashMap, die Daten über die Klasse Dictionary einlesen.

Stimmt, ein Dictionary<K, V> ist das C#-Pendant dazu. Aber was hast du bereits probiert? Wo hängst du? Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5, 4.a, 4.c

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Hi,

danke für die schnelle Antwort.
Bisher habe ich eigentlich nur folgendes:

Dictionary<string, object> myDic = new Dictionary<string,object>();

Dann habe ich mit der Methode "Add" einige Werte hinzugefügt und mit "TryGetValue" diese Werte wieder ausgegeben. Das grundsätzliche Prinzip dieser Klasse habe ich also so ungefähr verstanden.

Wo es bei mir jetzt hängt ist, wie ich die Daten, die ich vom WebService bekomme, in myDic einlesen kann.
In dem Java-Code wird die HashMap ja mit "call.invoke(new Object[] { playerID })" gefüllt, sofern ich das richtig verstanden habe.

Ein ähnliches Szenario habe ich unter C# ausprobiert mit den verschiedensten Varianten, leider ohne Erfolg.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Enulien,

wie ich die Daten, die ich vom WebService bekomme, in myDic einlesen kann.

Wie bekommst du denn die Daten vom WebSerive? Welcher Art sind diese Daten?
Schau dir das Dictionary<K, V> genauer an, dann solltest damit mit den Daten umgehen können. Konkrete Hilfe ist nicht möglich da ich keine Ahnung von den Daten vom WS habe.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
667 Beiträge seit 2004
vor 12 Jahren

Soetwas wie Dictionary.FillFromWebservice o.Ä. gibt es nicht. Du musst die Daten, die vom Webservice ankommen selbst mit Add() in das Dictionary schaufeln.

Falls die Daten als object Array (object[]) ankommen, tut es vielleicht statt dem Dictionary auch eine List<>.


object[] data = GetDataFromWebservice();
List<object> myList = new List(data);

"It is not wise to be wise" - Sun Tzu

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Danke nochmal für Eure versuche mir zu helfen.

Leider bin ich noch sehr viel weiter.

Egal was ich versuche ... es kommt entweder > Fehlermeldung:

Fehler beim Deserealisieren ... oder > Fehlermeldung:
Eine implizite Konvertierung vom Typ "ConsoleApplication1.WSCom.Player" in "object[]" ist nicht möglich.

Die Letztere erscheint beim Versuch eine Instanz der Object-Class zu erstellen und diese mit den Daten des Webservice zu füllen.

object[] newObj = myWS.webservicemethode(param);

Die Methode gibt ein Klassenobjekt mit dem Namen "Player" zurück. Habe ebenfalls schon versucht eine Instanz dieses "Player-Klasse" zu erstellen und diese dann mit dem Methodenergebnis zu füllen.

In diesem Fall kompiliert der Code zwar, ich bekomme aber einen Runtime Error > Fehlermeldung:

Fehler beim Deserialisieren des Textkörpers der Antwortnachricht für Vorgang "methodenname".

Beim detaillierten Anzeigen des Fehlers erscheint u.a. > Fehlermeldung:

Ein Objekt des Typ System.Xml.XmlNode[] kann nicht einem Objekt des Typs ConsoleApplication1.WSCom.Player zugewiesen werden.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Enulien,

lass uns das anders angehen, denn so ist es nicht zielführend. Wir wissen nicht wie der Webservice ausschaut und was dieser macht. Daher kann nicht konstruktiv geholfen werden - obwohl die Fehlermeldungen eindeutig sind.
Es bringt auch nix einfach den JAVA-Code nach C# zu portieren. In C# geht das anders, nämlich durch das Einbinden von einem Webverweis od. Serviceverweis. Hast du das gemacht?

Ich denke es ist einfacher wenn du ein Tutorial für Webservices mit .net/C# durcharbeitest, denn dann siehst du die Vorgehensweise wie es geht. Siehe Google-Suche nach c# webservice tutorial

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Hallo,
den Webverweis habe ich eingebunden.
Wie gesagt ... einfache Responses, die nur ein int oder string zurück liefern funktionieren ja auch. Nur bei den komplexen Datentypen bekomme ich die Fehler.

L
667 Beiträge seit 2004
vor 12 Jahren

Das klingt so also ob die MEthode myWS.webservicemethode() ein Array von XmlNodes zurückliefert. In dem Falls solltest Du Dir ein C# XML Tutorial suchen, in welchem Du Dir abschauen kannst, wie man die Infos aus den XMLNodes ausliest. Wie ist denn Deine Player-Klasse aufgebaut ?

"It is not wise to be wise" - Sun Tzu

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Also ... ich habe jetzt einmal den Netzwerk-Traffic gescannt und die SOAP-Response sieht folgendermaßen aus:


<ns1:methodenResonse>
   <ns1:type="ns2:Map">
      <item>
          <key xsi:type="xsd:string">
             id
          </key>
          <value xsi:type="xsd:int">
             idwert
          </value>
      </item>
      <item>
          <key xsi:type="xsd:string">
             name
          </key>
          <value xsi:type="xsd:string">
             namewert
          </value>
      </item> 
usw.

Laut Methoden-Definition wird die Klasse Player zurück gegeben.
Dabei stehen die "key"-Werte immer für die Felder in der Klasse Player. Die Klasse ansich ist relativ simple. 6 Felder und die dazugehörigen get/set-Methoden.

L
667 Beiträge seit 2004
vor 12 Jahren

Wenn ich dich richtig verstehe, willst Du am Ende ein Dictionary haben, in dem die Key/Value Paare aus der xml Datei gespeichert werden ? Wenn Deine Methode ein Objekt vom Typ Player zurück gibt dann musst Du das natürlich erstmal so umsetzen...


Player p = myWS.webservicemethode(param);

Jetzt weiß ich eben immer noch nicht genau, wie deine Player Klasse aufgebaut ist, aber nach Deiner Beschreibung solltest Du das jetzt so in ein Dictionary kriegen:


Dictionary d = new Dictionary<string, object>();
d.Add("NameField1", p.NameField1);
d.Add("NameField2", p.NameField2);
...

NameField1, 2 usw. musst Du natürlich noch durch die echten Namen ersetzen. Falls die Felder nicht public sind, rufe stattdessen eben die getter-Methode auf.

"It is not wise to be wise" - Sun Tzu

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Hi,

genau dieser Code ist es ja, der zu einem Fehler führt:

Player p = myWS.webservicemethode(param);

Und das, obwohl ein Objekt der Player-Klasse zurück gibt.

Mittlerweile hat sich auch jemand daran versucht, der sich ein bisschen besser in der Materie auskennt. Auch bei Ihm das Gleiche ... Rückgabe von einfachen Datentypen funktioniert, komplexe Datentypen führen zu Runtime Error "Fehler beim Deserialisieren...".

Scheint glaube ich eher ein VS 2010 Problem in Verbindung mit diesem speziellen WS zu sein.

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Kann es jemand bei Gelegenheit einmal ausprobieren?

Dienstverweis hinzufügen: http://www.comunio.de/soapservice.php?wsdl
Dienstverweisname: WSCom (dann könnt Ihr den Code unten einfach kopieren)

WSCom.soapservicewsdlPortTypeClient myCom = new WSCom.soapservicewsdlPortTypeClient();
WSCom.Player myPlayer = new WSCom.Player();

myPlayer = myCom.getplayerbyid(30517);

Vielen Dank an alle Helfer.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Enulien,

hier verträgt sich PHP und C# nicht, trotz "standardisiertem" SOAP. Hast du auf den PHP-Service Einfluss bzw. kannst du diesen ändern?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Hallo,

vielen Dank.
Auf den Webservice habe ich leider keinen Einfluss.
Liegt es an den rpc/encoded-Nachrichten?

Viele Grüße.

L
667 Beiträge seit 2004
vor 12 Jahren

Wie bindest Du denn den Webservice in dein C# Projekt ein ? Über einen Webverweis ?

Wenn ja, dann stelle mal sicher, dass Du auch die Player-Klasse aus den Proxy-Klassen (die beim Hinzufügen des Webverweises erzeugt werden) benutzt und nicht eine andere (lokale) Player-Klasse, die nur gleich aufgebaut ist.

Du kannst Dir auch mal ein object zurückgeben lassen


object p = myWS.webservicemethode(param); 

und dann per p.GetType().ToString() prüfen, auf welchen Rückgabetyp (in welchem Namespace, in welcher Assembly) sich die Webservice-Methode bezieht.

"It is not wise to be wise" - Sun Tzu

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Hi,

ich habe schon die Einbindung über einen Dienstverweis und einen Webverweis versucht.
Beim Dienstverweis kommt als Fehler "Fehler beim Deserialisieren ..." und beim Webverweis "Fehler in XML-Dokument".
Sobald ich die Methode aufrufe, kommen diese Fehler. D.h.:

object p = myWs.webservicemethode(param) 

führt schon zu einem Runtime-Error. Habe auch schon versucht, einfach die Raw-Soap-Response in eine Datei zu speichern --> ebenfalls ohne Erfolg.

Gruß
Enulien

L
667 Beiträge seit 2004
vor 12 Jahren

Fehler in XML-Dokument klingt so als ob der Webservice schon Mist zurück gibt. Kann man die Webservicemethode denn in irgendeiner anderen Umgebung konsumieren, bzw. ist es sicher, dass der Webservice überhaupt korrekt funktioniert ?

Kannst Du bei der Exception Fehler in XML-Dokument in der inner Exception nachschauen, ob dort ein detaillierterer Fehler angegeben ist ?

Ich sehe nicht, warum es einen Fehler geben sollte, nur weil es ein PHP-Webservice ist. Gerade um technologieunabhängig zu sein führt man ja eine Zwischenebene wie z.B. SOAP ein.

"It is not wise to be wise" - Sun Tzu

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

Der Fehler ist Folgender:> Fehlermeldung:

"Ein Objekt des Typ System.Xml.XmlNode[] kann nicht einem Objekt des Typs ConsoleApplication1.WSCom.Player zugewiesen werden."

Ich denke, dass Problem ist einfach, dass VS eine komplett andere Response erwartet, als tatsächlich ankommt. Wieso es als Key/Value-Pair ankommt verstehe ich auch nicht so ganz.

Wieso kann es nicht einfach so aussehen:

<player>
  <id>idwert</id>
  <name>namenswert</name>
  ...  
</player> 

Denn denke ich könnte VS die Response verarbeiten und die Werte den Feldern der Klasse "zuordnen".
So "stößt" das System bei der "Resonse-Analyse" auf XML-Nodes (item,key oder value) und steigt aus.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Enulien,

VS erwartet gar nix, das ist eine Entwicklungsumgebung und nicht dein Programm das ausgeführt wurd und was erwartet.

Der PHP-Service liefert hier einfach ein anderes als erwartetes Ergebnis. Dieses kann auf der .net-Seite nicht deserialisiert werden. Daher der Fehler.

Suche mal in die Richtung von PHP-Service und C# und deren Probleme. Ich kann leider nicht direkter helfen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
1.214 Beiträge seit 2006
vor 12 Jahren

Das Problem hatte ich vor Jahren auch mal. Damals hatte php nicht mal direkt SOAP Unterstützung und ich hab irgendeine Bibliothek verwendet, um die WSDL Dateien aus PHP Klassen zu generieren und hatte dabei genau dasselbe Problem. Ich hab die WSDL Dateien damals einfach von Hand angepasst.

E
Enulien Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

VS erwartet gar nix, das ist eine Entwicklungsumgebung und nicht dein Programm das ausgeführt wurd und was erwartet.

OK, danke für die Korrektur. 😉 Dann erwartet "DAS PROGRAMM" halt etwas anderes, wie Du ja selbst unten schreibst.

Der PHP-Service liefert hier einfach ein anderes als erwartetes Ergebnis.

Bin auch gerade an anderer Stelle fündig geworden. Ich gehe davon aus, dass es mein Problem erklärt.
Known Bug