Laden...

Wie kann ich bei bei OData (Connected Services) in VS bessere Exceptions anzeigen?

Erstellt von Davaaron vor 3 Jahren Letzter Beitrag vor 3 Jahren 935 Views
D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren
Wie kann ich bei bei OData (Connected Services) in VS bessere Exceptions anzeigen?

Hi,

für meine Business Central API habe ich mir Connected Services (ist eine Erweiterung von Visual Studio, früher ging das mit "Add service reference") erstellt. Die Erweiterung erstellt mir Proxies aus der angegebenen $metadata-URL, die ich dann ganz einfach im Code verwenden kann.
Beim Testen dieser Services ist mir aufgefallen, dass ich manchmal ein "Bad Request" - 400 zurückbekomme, ohne Inhalt oder einer Bemerkung, was schief gelaufen ist. Zum Glück habe ich den Web Debugger von Telerik gefunden, der mir das Mitschneiden des Network traffics erlaubt und glücklicherweise auch die SSL (wohl eher TLS) verschlüsselten Requests and Reponses anzeigt. In der Reponse sehe ich dann, was genau schief gelaufen ist. Allerdings sehe ich die konkrete Fehlermeldung nicht beim Debuggen in Visual Studio.

Gibt es eine Möglichkeit, auch in Visual Studio die genauen Exceptions anzuzeigen?

P
441 Beiträge seit 2014
vor 3 Jahren

Hi,

wenn du sagst du erzeugst deine Proxies selber auf Basis der Metadaten, wirst du ja in den Proxies eien HttpClient verwenden.
Dieser behandelt deinen Http Request auf deine OData API. Hier solltest du auch an die Fehlerbeschreibung kommen.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Von der Struktur erinnert mich die OData Client API etwas an Entity Framework: Man hat einen Context mit allen Endpunkten als Properties (z.B. new MyContext().Persons.ToList()) und man kann Queries erstellen. Allerdings finde ich keinen Weg, direkt an den Http Client zu kommen.
Man kann an ein paar Events hängen bzw Actions/Funcs mitgeben, aber auch da sehe ich aktuell keine Chance. Ein Event "ReceivingResponse" scheint zunächst mal vielversprechend, aber in der HttpResponseMessage Klasse sehe ich den Body nicht bzw sehe auch da nur "400 - Bad Request".
Wahrscheinlich müsste ich mir das alles selbst aus dem Stream ziehen und dekodieren. Ich werde voerst bei Web Debugger bleiben.

P
441 Beiträge seit 2014
vor 3 Jahren

Okay, mit MS Dynamics habe ich noch nicht gearbeitet.
Ich kann mir aber fast nicht vorstellen, dass du bei dem OData Context nicht einen HttpClientHandler oder was ähnliches mitgeben kannst.

16.806 Beiträge seit 2008
vor 3 Jahren

früher ging das mit "Add service reference"

Das ging nur mit SOAP und war eher so semi-gut.

Für OData gab oder gibt es eine Extension in der Gallery, der anhand der Metadaten den Code generieren kann.
Aber es ist halt auch nur ein Code Generator, der nicht zwangsläufig alle Anforderung abdecken kann, die Du haben willst - und er ist veraltet.
Er verwendet den alten Client und hat nichts mit einem neuen Muster mit Factories und Co zutun.

Modern gehts nur mit eigenem Code und mit dem neuen OData Client https://github.com/OData/odata.net

Gibt es eine Möglichkeit, auch in Visual Studio die genauen Exceptions anzuzeigen?

Nein, denn Visual Studio ist prinzipiell nur eine Entwicklungsumgebung. Wenn Dir der OData Client das nicht aufsammeln, dann bekommst Du natürlich auch nichts.

Ergo musst Du Dir den Client so schreiben, dass er die Error Messages aufnimmt.
Es gibt in OData keinen Standard, wie Errors vom Server an den Client übermittelt werden.

Von der Struktur erinnert mich die OData Client API etwas an Entity Framework:

Das liegt daran, dass es in beiden Welten Collections und die Bezeichnung von Entitäten gibt.
Prinzipiell kann man dieses Grundkonstrukt auf alle Arten von Datenquellen beziehen.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Aber es ist halt auch nur ein Code Generator, der nicht zwangsläufig alle Anforderung abdecken kann, die Du haben willst - und er ist veraltet.

Also ich benutze hierfür die "OData Connected Service" Erweiterung, die, glaube ich, nicht veraltet ist, denn sie erstellt OData V4 Services, die wiederum Klassen aus dem "OData Client" Projekt verwenden. Beispielsweise kommt der automatisch erstellte Datenkontext (DataServiceContext) aus Namespace "Microsoft.OData.Client".

Gibt es eine Möglichkeit, auch in Visual Studio die genauen Exceptions anzuzeigen?

Nein, denn Visual Studio ist prinzipiell nur eine Entwicklungsumgebung. Wenn Dir der OData Client das nicht aufsammeln, dann bekommst Du natürlich auch nichts.

Die Frage habe ich missverständlich gestellt. Damit meinte ich eher, ob ich es mithilfe der Connected Services (OData) so gut hinbekommen kann wie der Web Debugger von Fiddler.

@Papst, @Abt
Das würde wahrscheinlich mit OData Lib gehen (habe ich gerade eben durch Abts Link gefunden), aber das ist mir zu viel Aufwand für das aktuelle Projekt. Ich bleibe bei Fiddler (wieso Dinge neu erfinden). Wäre aber für die Zukunft sicherlich ein Gedanke wert, alleine schon des Loggings wegen.

16.806 Beiträge seit 2008
vor 3 Jahren

Die GitHub Seite von der von Dir genannten Extension zeigt auf:
Use HttpClient in OData Client

Sollte also kein Problem sein an die Raw Message zu kommen.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Weiß jemand, ob man SOAP statt ODataV4 verwenden kann und ob es dafür schon Libraries gibt?

16.806 Beiträge seit 2008
vor 3 Jahren

SOAP ist ein Steinzeit-Protokoll, das kaum auf moderne Art verwendet werden kann.
Warum magst Du darauf setzen? Auch der Tooling-Support ist quasi nicht mehr vorhanden; wurde fast überall zugunsten modernerer Ansätze entfernt.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Warum magst Du darauf setzen?

Mögen ganz und gar nicht. Ich mag SOAP nicht, erinnert mich immer an WCF und das mochte ich auch nicht.

Aber ich denke ich muss, weil ich eine Codeunit habe, die ich gerne per API anstoßen will und das leider nur mit SOAP funktioniert laut Microsoft:

Microsoft Web-Services

Wüsste sonst nicht, wie ich das ermöglichen könnte.

16.806 Beiträge seit 2008
vor 3 Jahren

An Deiner Frage war nicht zu erkennen, dass Du von einer API abhängig bist. Die hat sich eher vollkommen losgelöst angehört.
Wenn Dir die API nur SOAP für so ein Feature anbietet, dann ist das ja beantwortet.

Musst halt ein SOAP Client (alternativ oder zusätzlich) verwenden.

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren

Habe über "Webverweis hinzufügen" die Dienst aus BC übernehmen können. Dies hat mir einige WSDL Dateien generier, allerdings kann Visual Studio die Klassen dafür nicht finden.
Bspw. habe ich eine "MitarbeiterPlan.wsdl" und der Webverweisname ist "SoapService".
Laut Blog-Post sollte ich nun den Service mit

SoapService.MitarbeiterPlan plan = new SoapService.MitarbeiterPlan() 

instanziieren und verwenden können. 🤔

Nur Probleme.. 😭