Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich bei bei OData (Connected Services) in VS bessere Exceptions anzeigen?
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 344
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Davaaron am .
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 344
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

Zitat von Davaaron
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
Zitat von Davaaron
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.
Zitat von Davaaron
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.
private Nachricht | Beiträge des Benutzers
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

beantworten | zitieren | melden

Zitat
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".
Zitat
Gibt es eine Möglichkeit, auch in Visual Studio die genauen Exceptions anzuzeigen?
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Davaaron am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

beantworten | zitieren | melden

Weiß jemand, ob man SOAP statt ODataV4 verwenden kann und ob es dafür schon Libraries gibt?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15536
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Davaaron
myCSharp.de - Member



Dabei seit:
Beiträge: 107

Themenstarter:

beantworten | zitieren | melden

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.. ;(
private Nachricht | Beiträge des Benutzers