Deserialize wird nicht aufgerufen

76 views
Skip to first unread message

perlfred

unread,
Mar 4, 2015, 7:50:43 AM3/4/15
to immobilienscou...@googlegroups.com
Hallo!

Ich habe mich jetzt wieder ein wenig in die Materie eingearbeitet ...

Ich habe das Problem, dass nach dem Ausführen des Requestes:

var response = client.Execute<T>(request);

nicht die Deserialisierung:

public T Deserialize<T>(IRestResponse response)

(automatisch) aufgerufen wird.

Dies war früher immer der Fall, wenn das XML-Schema nicht korrekt verarbeitet werden konnte. Einen Fehlerhinweis konnte ich immer dem Content der Antwort entnehmen. Jetzt erhalte ich aber die Meldung:

{"common.messages":[{"message":{"messageCode":"MESSAGE_RESOURCE_CREATED","message":"Resource [realestate] with id [62657232] has been created.","id":"62657232"}}]}

Wenn ich meine XML-Datei im PlayGround teste, erhalte ich auch keine Fehlermeldung.

Hat jemand noch einen Hinweis, warum die Deserialisierung nicht (mehr) ausgelöst wird???

Fred.


<?xml version="1.0" encoding="utf-8"?>
<q1:apartmentRent xmlns:q1="http://rest.immobilienscout24.de/schema/offer/realestates/1.0">
  <externalId>1101.008</externalId>
  <title>Wohnen am Sonnenwall---viel Grün---schöne große Höfe---ruhige Seitenstraße</title>
  <address>
    <street>Löbauer Str.</street>
    <houseNumber>54</houseNumber>
    <postcode>04347</postcode>
    <city> Leipzig</city>
  </address>
  <apiSearchData>
    <searchField1 />
    <searchField2 />
    <searchField3 />
  </apiSearchData>
  <groupNumber>0</groupNumber>
  <descriptionNote>Die Wohnanlagen Schönefeld bieten inmitten großer, begrünter Innenhöfe mit Balkon ausgestattete, sanierte 1-4 Raum-Wohnungen. Im Treffpunkt Schönefeld des BGL-Nachbarschafts- hilfevereins finden regelmäßig Veranstaltungen für die Generation 50+ statt.</descriptionNote>
  <furnishingNote>Bad mit Wanne
Tapete: Wand &amp; Decke
Fussboden: PVC/Laminat
</furnishingNote>
  <locationNote>Im Osten Leipzigs bietet Schönefeld als gut strukturierter Stadtteil allen Generationen ideale Wohnmöglichkeiten und mit dem Mariannenpark, dem Sommerbad Schönefeld und einer Schwimmhalle gute Freizeitangebote.</locationNote>
  <otherNote />
  <showAddress>true</showAddress>
  <contact id="59375400" />
  <apartmentType>NO_INFORMATION</apartmentType>
  <floor>3</floor>
  <lift>false</lift>
  <assistedLiving>false</assistedLiving>
  <cellar>YES</cellar>
  <handicappedAccessible>NOT_APPLICABLE</handicappedAccessible>
  <condition>NO_INFORMATION</condition>
  <interiorQuality>NO_INFORMATION</interiorQuality>
  <constructionYear>1976</constructionYear>
  <freeFrom />
  <heatingType>CENTRAL_HEATING</heatingType>
  <firingTypes>
    <firingType>DISTRICT_HEATING</firingType>
  </firingTypes>
  <buildingEnergyRatingType>ENERGY_CONSUMPTION</buildingEnergyRatingType>
  <thermalCharacteristic>97</thermalCharacteristic>
  <energyConsumptionContainsWarmWater>YES</energyConsumptionContainsWarmWater>
  <numberOfBathRooms>1</numberOfBathRooms>
  <guestToilet>NOT_APPLICABLE</guestToilet>
  <parkingSpaceType>NO_INFORMATION</parkingSpaceType>
  <baseRent>276</baseRent>
  <totalRent>396</totalRent>
  <serviceCharge>120</serviceCharge>
  <deposit>Genossenschaftsanteile erforderlich.</deposit>
  <heatingCosts>60</heatingCosts>
  <heatingCostsInServiceCharge>YES</heatingCostsInServiceCharge>
  <petsAllowed>NO_INFORMATION</petsAllowed>
  <livingSpace>60</livingSpace>
  <numberOfRooms>3</numberOfRooms>
  <builtInKitchen>false</builtInKitchen>
  <balcony>false</balcony>
  <certificateOfEligibilityNeeded>false</certificateOfEligibilityNeeded>
  <garden>false</garden>
  <courtage>
    <hasCourtage>NO</hasCourtage>
    <courtage />
    <courtageNote />
  </courtage>
</q1:apartmentRent>




Michael Ganß

unread,
Mar 5, 2015, 6:16:29 AM3/5/15
to immobilienscou...@googlegroups.com
Ich habe den Verdacht, wie schon in dem anderen Thread geäußert, dass
das ein JSON vs. XML Problem ist. Wenn kein Transport-Fehler
aufgetreten ist (keine Verbindung etc.), also eine HTTP-Response
zurückgekommen ist, sollte immer versucht werden, die Fehlermeldung zu
deserialisieren. Deshalb kommt es übrigens zu merkwürdigen Exceptions,
wenn bei einem Fehler vom Server HTML zurückgeliefert wird, so wie
neulich hier diskutiert.

Ich kann sonst nur raten, in den Code reinzusteppen. Das müsste
eigentlich auch gehen, wenn du das NuGet-Package hast, es wird auch
immer ein Symbol-Package veröffentlicht.
> --
> Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der
> Gruppe "immobilienscout24-development" abonniert haben.
> Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser
> Gruppe erhalten möchten, senden Sie eine E-Mail an
> immobilienscout24-de...@googlegroups.com.
> Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine
> E-Mail an immobilienscou...@googlegroups.com.
> Gruppe besuchen:
> http://groups.google.com/group/immobilienscout24-development
> Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie
> https://groups.google.com/d/msgid/immobilienscout24-development/7b7514d2-1852-4a21-96ed-50926d49dac0%40googlegroups.com
> auf.
> Weitere Optionen finden Sie unter https://groups.google.com/d/optout.

perlfred

unread,
Mar 5, 2015, 8:08:02 AM3/5/15
to immobilienscou...@googlegroups.com
Hallo Michael! 

Meines Erachtens, kommt gar keine Fehlermeldung.

Ich denke, es ist fast genau wie früher. Wenn das XML-Schema nicht passt (oder unvollständig ist), habe ich kein "Ergebnis" = Deserialisierungs-Aufruf bekommen. Früher hatte ich nur immer einen Hinweis im Content der Response auf Schemata-Fehler. Deswegen habe ich mir das akt. Schema (ApartmentRent) genau angesehen und dabei festgestellt, dass jetzt für die Energie-Optionen auch ganz andere Felder vorhanden sind.

Beim (für mich erstmaligen) aktualisieren der IS24 API-Felder bin ich aber auf folgende Fehler gestoßen:

Das Aktualisieren der XSD-Dateien mit Hilfe des PowerShell Scriptes: DownloadSchemaFiles.ps1 funktioniert. (Die akt. XSD-Dateien werden in das XSD-Verzeichnis geladen)

 

Wenn ich danach aber das PowerShell-Script: GenerateClasses.ps1 ausführe, kommen Fehler über Fehler (siehe Bild).

  • Parameter 1 kann nicht NULL sein. Muss ich diesem Script noch etwas übergeben???

  • Das Script möchte auf ein Package XmlSchemaClassGenertator zugreifen, welches (bei mir) gar nicht vorhanden ist. Muss ich noch etwas installieren?

Ich würde die Abfrage gern erst noch mit den akt. API-Feldern ausführen, da ich hier das Problem vermute.

Könntest du mich erst noch bei der Aktualisierung der API-Felder  -> Erstellung der IS24.cs unterstützen, damit wir diese Fehlerquelle ausschließen können ?

Vielen Dank für deine Antwort!

Fred.



PS.:

- Akt. verwendete API-Version: Runtime Version:4.0.30319.34003
- Verwende XML

private T Execute<T>(RestRequest request, string baseUrl = null) where T : new()

{

baseUrl = baseUrl == null ? BaseUrl : string.Join("/", BaseUrlPrefix, baseUrl);

var client = new RestClient(baseUrl);

client.Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret);

client.AddHandler("application/xml", XmlDeserializer);

request.XmlSerializer = XmlSerializer;

get_Request(request); // Request-Parameter Auslesen für eine Anzeige in der Applikation

var response = client.Execute<T>(request);

if (response.ErrorException != null) throw response.ErrorException;

return (T)Konvert_ContentToMessages<T>(response);

// return response.Data;

}



Michael Ganß

unread,
Mar 5, 2015, 10:01:14 AM3/5/15
to immobilienscou...@googlegroups.com

Meines Erachtens, kommt gar keine Fehlermeldung.

Ich glaube auch nicht, dass (serverseitig) ein Fehler auftritt, der Server antwortet einfach nur mit JSON statt XML, was dann zu Problemen führt.
 
  • Das Script möchte auf ein Package XmlSchemaClassGenertator zugreifen, welches (bei mir) gar nicht vorhanden ist. Muss ich noch etwas installieren?

Es sieht so aus, als wenn die benötigten NuGet-Packages nicht vorhanden wären. Dazu IS24RestApi.sln in Visual Studio öffnen und einmal bauen (F6). Oder von der Kommandozeile:
NuGet.exe restore IS24RestApi.sln
NuGet.exe gibt es hier: http://nuget.org/nuget.exe

perlfred

unread,
Mar 5, 2015, 11:56:50 AM3/5/15
to immobilienscou...@googlegroups.com
Hallo Michael! 

Zu deiner (sicherlich berechtigten) Vermutung nur die Anmerkung, bei anderen Requests (z.B. Kontakt Abfrage) wird aber ein XML zurückgegeben (Deserialisierung wird aufgerufen). Ist das bei ein und den selben Server möglich?

Danke, nun wird mir einiges Klarer (Erstellung IS24RestApi-Projekt, um Packages zu erhalten). Nachdem ich die Packages in meine Anwendung kopiert habe, kann ich das PowerShell-Script besser debuggen.

[GenerateClasses]
In Zeile 9  muss der Pfad von ..\..   in .\.. geändert werden, damit die XmlSchemaClassGenerator-dll geladen wird.

$dll = ls .\..\packages\XmlSchemaClassGenerator*\lib\*\XmlSchemaClassGenerator.dll | Sort-Object LastModificationTime -Descending | Select-Object -First 1

Ein Problem habe ich aber noch in Zeile 42. Das



XmlSchemaClassGenerator - Objekt hat keine Generator.NamespaceMapping Eigenschaft!


Geladene DLL:

Verwende ich die falsche DLL oder das falsche Script?

















































Michael Ganß

unread,
Mar 5, 2015, 12:22:49 PM3/5/15
to immobilienscou...@googlegroups.com
Das GenerateClasses.ps1 Script sieht alt aus. Pull nochmal den aktuellen Source von GitHub.

--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "immobilienscout24-development" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an immobilienscout24-de...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an immobilienscou...@googlegroups.com.
Gruppe besuchen: http://groups.google.com/group/immobilienscout24-development

perlfred

unread,
Mar 6, 2015, 6:47:31 AM3/6/15
to immobilienscou...@googlegroups.com
Hallo Michael! 

Im akt. Script wird der XmlSchemaClassGenerator.Generator.NamespaceProviderEigenschaft das Namespace Dictionary zugeordnet.

Da es vielleicht auch für andere interessant sein könnte ...  Bei mir lief das (aktuelle) GenerateClasses - Script nach folgenden Anpassungen:
(Ich gehe davon aus, das das Powerscript in dem XSD-Verzeichnis des akt. Projektes ausgeführt wird.)

[GenerateClasses]
In Zeile 9  muss der Pfad von ..\..   in .\.. geändert werden, damit die XmlSchemaClassGenerator-dll geladen wird.

$dll = ls .\..\packages\XmlSchemaClassGenerator*\lib\*\XmlSchemaClassGenerator.dll | Sort-Object LastModificationTime -Descending | Select-Object -First 1

In Zeile 47 muss der Pfad  */*.xsd  in *.xsd geändert werden, damit die Schema-Dateien des aktuellen Verzeichnis eingelesen werden.
[System.String[]]$files = ls *.xsd | %{ $_.FullName }

Wenn in dem übergeordnetem Verzeichnis vom Ausführungs-Verzeichnis (XSD) noch kein <generated> - Verzeichnis existiert, dann dieses erstellen.
Ab Zeile 50 einfügen (oder ohne Script "manuell" ausführen)

if(-not (Test-Path ..\generated -pathType container))

{

   New-Item -Path "..\" -Name "generated" -ItemType directory

    echo "Verzeichnis: <generated> erstellt."

    echo ""

}

So weit, so gut. Ich habe jetzt im generated-Verzeichnis die Klassen-Dateien der aktuellen IS24-Schemas. Aber wie erhalte ich denn jetzt meine aktualisierte IS24.cs?

Michael Ganß

unread,
Mar 6, 2015, 8:02:05 AM3/6/15
to immobilienscou...@googlegroups.com
In neueren Versionen von IS24RestApi, die Code mit
XmlSchemaClassGenerator und nicht mehr mit xsd.exe generieren, gibt es
keine einzelne IS24.cs Datei mehr, sondern eine Datei pro Namespace.
Du könntest die jetzt alle in eine Datei reinpacken und versuchen, die
mit dem anderen alten Code zu verwenden, aber ich denke da begibst du
dich in ein Tal der Tränen. Besser ist es, den aktuellen Code nochmal
von GitHub zu clonen und dann in deinen zu integrieren.
> --
> Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der
> Gruppe "immobilienscout24-development" abonniert haben.
> Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser
> Gruppe erhalten möchten, senden Sie eine E-Mail an
> immobilienscout24-de...@googlegroups.com.
> Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine
> E-Mail an immobilienscou...@googlegroups.com.
> Gruppe besuchen:
> http://groups.google.com/group/immobilienscout24-development
> Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie
> https://groups.google.com/d/msgid/immobilienscout24-development/7220f021-85e0-411f-b1c3-b976d09648bc%40googlegroups.com

perlfred

unread,
Mar 12, 2015, 5:08:31 AM3/12/15
to immobilienscou...@googlegroups.com
Hallo Michael!

Ach wenn man doch mal an einer Sache dran bleiben könnte...

Den Code wieder neu zu übernehmen, ist ja nicht gerade eine Aufgabe die man mal so nebenbei macht, aber wenn's nicht anders geht.. Schema-Änderungen muss ich auch in Zukunft aktualisieren können.

Bevor ich mich aber darauf stürze... Der eigentliche Ausgangspunkt meiner Anfrage war ja, das ich zu der Antwort (Response) keine Daten erhalte. Darauf hattest du geantwortet:

Wenn kein Transport-Fehler aufgetreten ist (keine Verbindung etc.), also eine HTTP-Response zurückgekommen ist, sollte immer versucht werden, die Fehlermeldung zu deserialisieren...

Wie mache ich denn das? Mit dem VS-Debugger komme ich bis zu dem Punkt, an dem der Request abgesendet wird (var response = client.Execute<T>(request);) im Normalfall wird dann die Deserialisierungs-Routine "automatisch" aufgerufen (T Deserialize<T>(IRestResponse response)). Im Fehlerfall, wird aber gleich mit der Abarbeitung des Request's fortgefahren (if (response.ErrorException != null) throw response.ErrorException). Mir ist jetzt unklar, wie ich den Prozess der Antwort des Servers nachvollziehen kann :-(

Ich kann sonst nur raten, in den Code reinzusteppen. Das müsste eigentlich auch gehen, wenn du das NuGet-Package hast, es wird auch immer ein Symbol-Package veröffentlicht.  ????

Vielen Dank!

Fred.

Michael Ganß

unread,
Mar 12, 2015, 1:22:00 PM3/12/15
to immobilienscou...@googlegroups.com
> Wie mache ich denn das? Mit dem VS-Debugger komme ich bis zu dem Punkt, an
> dem der Request abgesendet wird (var response = client.Execute<T>(request);)
> im Normalfall wird dann die Deserialisierungs-Routine "automatisch"
> aufgerufen (T Deserialize<T>(IRestResponse response)). Im Fehlerfall, wird
> aber gleich mit der Abarbeitung des Request's fortgefahren (if
> (response.ErrorException != null) throw response.ErrorException). Mir ist
> jetzt unklar, wie ich den Prozess der Antwort des Servers nachvollziehen
> kann :-(

Mit "sollte" meinte ich, das sollte automatisch passieren. Ich weiß
nicht welchen Stand du hast, aber wenn ich das richtig sehe, hast du
eine sehr frühe Version, wo im Fehlerfall (HTTP Status >= 400) auch
versucht wird, in den eigentlich erwarteten Typ zu deserialisieren
(bspw. ApartmentRent) und nicht in den dann zurückgelieferten Typ
Messages (was IMO auch ein bisschen unkoscher von der API ist).
Probier mal den Code von ein paar Commits später zu integrieren, bspw.
von hier:
https://github.com/mganss/IS24RestApi/blob/69b18311a5523dddeb64f0b6bdd42d9fc8252875/RestApi.cs

perlfred

unread,
Mar 13, 2015, 8:23:56 AM3/13/15
to immobilienscou...@googlegroups.com
Hallo Michael!

Jetzt kommen wir der Ursache wahrscheinlich ein bisschen näher:

... wo im Fehlerfall (HTTP Status >= 400) auch versucht wird, in den eigentlich erwarteten Typ zu deserialisieren (bspw. ApartmentRent) und nicht in den dann zurückgelieferten Typ Messages ...

Jetzt stellt sich bloß die Frage: Früher (bis vor ca. 1 Monat) funktionierte es ja auch mit dem "alten" Code (ohne Beachtung des Rückgabe-Typ's) also muss sich doch etwas geändert haben.

Ich habe die RestApi von deinem Link versucht einzubinden. Da kommen aber auch nach diversen Anpassungen zu viele Fehler. Wahrscheinlich passt diese Version nicht mit dem Stand der aktuell installierten Packages zusammen. Im Grunde genommen werden hier aber die Abfragen ja auch schon asynchron und über Schnittstellen ausgeführt, so dass ich meinen Fehler so nicht nachvollziehen kann.

Deshalb und wegen der Schema-Aktualisierungsproblematik werde ich meine Kraft/Zeit eher in die Integration der neuen API in mein Projekt investieren (müssen).

Trotzdem vielen!! Dank!! für deine Hilfe! Ich habe auch wieder einiges mehr über die internen Zusammenhänge der Kommunikation in der REST-API erfahren.

Fred.


Michael Ganß

unread,
Mar 16, 2015, 7:37:03 AM3/16/15
to immobilienscou...@googlegroups.com
... wo im Fehlerfall (HTTP Status >= 400) auch versucht wird, in den eigentlich erwarteten Typ zu deserialisieren (bspw. ApartmentRent) und nicht in den dann zurückgelieferten Typ Messages ...

Jetzt stellt sich bloß die Frage: Früher (bis vor ca. 1 Monat) funktionierte es ja auch mit dem "alten" Code (ohne Beachtung des Rückgabe-Typ's) also muss sich doch etwas geändert haben.


Wie du oben geschrieben hast, tritt ja gar kein Fehler auf, also müsste in jedem Fall deserialisiert werden. Das Problem mit dem Fehlerfall war von mir also ein bisschen off-track. Ich denke immer noch das Problem hat was mit JSON vs. XML zu tun. Probier mal die Zeile mit "client.ClearHandlers();" an der entsprechenden Stelle bei dir einzufügen:

perlfred

unread,
Mar 17, 2015, 12:15:57 PM3/17/15
to immobilienscou...@googlegroups.com
Hallo Michael!

Die Methoden client.ClearHandlers() und client.AddHandler("application/xml", xmlDeserializer) waren bereits in der Execute<T>() Methode.

Ich habe nun "bloß" das Problem, beim (heutigem) Testen wurde wieder Deserialisiert! Und ich habe nicht eine Zeile im altem Projekt geändert!!!
Lachen, heulen, staunen ... meine Tischkante ist schon ausgebeult :-)

Wie gesagt, ich bin gerade dabei auf die aktuelle (asynchrone) API umzustellen. Und schwups habe ich auch wieder ein Problem. In WPF kommt der Task nach dem Aufruf von:


           var response = Deserialize<T>(request, await client.ExecuteTaskAsync(request));

nicht mehr zurück. Die gleichen Programm-Zeilen (Copy/Paste) in eine Konsolen-Anwendung kopiert und die Welt ist schön.

Ich werde den Aufruf jetzt mal in einen separaten Task auslagern, damit der Task nicht vom Grafik-Task aus gestartet wird ... ansonsten, hat schon jemand die akt. API in eine WPF Umgebung eingebunden?

Ansonsten euch allen einen schönen Feierabend ...

Fred.

Michael Ganß

unread,
Mar 17, 2015, 5:10:43 PM3/17/15
to immobilienscou...@googlegroups.com
Ich habe nun "bloß" das Problem, beim (heutigem) Testen wurde wieder Deserialisiert! Und ich habe nicht eine Zeile im altem Projekt geändert!!!

Merkwürdig. Falls du das Problem reproduzieren kannst, würde ich mal mit Wireshark o.ä. gucken, wie der Request-Header aussieht und was als Response zurückkommt.
 
Wie gesagt, ich bin gerade dabei auf die aktuelle (asynchrone) API umzustellen. Und schwups habe ich auch wieder ein Problem. In WPF kommt der Task nach dem Aufruf von:
           var response = Deserialize<T>(request, await client.ExecuteTaskAsync(request));
nicht mehr zurück. Die gleichen Programm-Zeilen (Copy/Paste) in eine Konsolen-Anwendung kopiert und die Welt ist schön.
 
Vielleicht blockierst du den UI Thread. Siehe http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

perlfred

unread,
Mar 18, 2015, 10:31:04 AM3/18/15
to immobilienscou...@googlegroups.com
Hallo Michael!

Du hattest natürlich wieder einmal recht!!

Normalerweise kann man in WPF die Blockierung des GUI-Threads durch Auslagerung des Codes in einen separaten Thread (z.B. durch Einsatzes eines BackgroundWorker) umgehen. In diesem Fall funktionierte dies aber nicht.
Dein Link erklärt aber die Deadlock Situation bei der asynchronen Programmierung wunderbar!

Für alle, die an einer (schnellen) Lösung interessiert sind:
- Die aufrufende Methode (von der GUI aus) als Async-Methode deklarieren (private async void btnStart_Click(object sender, RoutedEventArgs e))   -> Durchgängige asynchrone Aufrufe = durchgängiges warten = korrektes Zurückspringen
- In der aufrufenden Methode den Aufruf der REST-API-Methoden mit dem await-Operator starten (await TestAsync(config); // Test-Anwendung starten)

Der Deserialisierungs-Fehler ist noch nicht wieder aufgetreten. Mit deiner Lösung kann ich jetzt aber produktiv an der Umsetzung mit der neuen API arbeiten!

Nochmals vielen Dank!

Fred.
Reply all
Reply to author
Forward
0 new messages