Fehlerdetails aus der WCF-REST abgerufen

8

Ich habe einen REST-Dienst, der von einem .Net-WCF-Client verwendet wird.

Wenn ein Fehler auftritt, gibt der REST-Service eine HTTP 400 Bad Request mit dem Antworthauptteil zurück, der die serialisierten JSON-Details enthält.

Wenn ich die Anfrage mit Fiddler, Javascript oder direkt von C # aus führe, kann ich einfach auf den Antworttext zugreifen, wenn ein Fehler auftritt.

Allerdings verwende ich eine WCF ChannelFactory mit 6 recht komplexen Schnittstellen. Die Ausnahme, die von diesem Proxy ausgelöst wird, ist immer ein ProtocolException , ohne nützliche Details.

Gibt es eine Möglichkeit, den Antworttext zu erhalten, wenn dieser Fehler auftritt?

Aktualisieren

Ich stelle fest, dass es eine Menge verschiedener Möglichkeiten gibt, dies mit .Net zu tun, und dass es andere Möglichkeiten gibt, die Fehlerreaktion zu erhalten. Sie sind nützlich zu wissen, aber beantworten Sie diese Frage nicht.

Die von uns verwendeten REST-Services ändern sich und wenn sie es tun, werden die komplexen Schnittstellen aktualisiert. Die Verwendung von ChannelFactory mit den neuen Schnittstellen bedeutet, dass wir Ausnahmen zur Kompilierungszeit (anstatt zur Laufzeit) erhalten und diese viel einfacher pflegen und den Code aktualisieren können.

Gibt es eine Möglichkeit, den Antworttext für einen Fehler HTTP-Status zu erhalten, wenn WCF-Kanäle verwenden?

    
Keith 25.03.2010, 15:35
quelle

6 Antworten

1

Benutze keine ChannelFactory :-) Aber ernsthaft. Warum würden Sie eine REST-Schnittstelle erstellen und dann den WCF-Client-Proxy verwenden? Welchen Vorteil bietet der REST-Service? Warum nicht einfach wsHttpBinding verwenden? Mit der HttpClient-Klasse aus dem REST-Starterkit können Sie Standard-HTTP-Anforderungen erstellen und anschließend die Antwort mithilfe des DataContractSerializers deserialisieren.

z. B.

%Vor%     
Darrel Miller 25.03.2010, 23:05
quelle
4

Sie können das Ausnahmedetail wie folgt abrufen:

%Vor%     
Oak 10.03.2011 15:05
quelle
3

Sie könnten versuchen, eine WebProtocolException aus dem Service zu werfen. Auf diese Weise sollten die Fehlerdetails im Hauptteil der HTTP-Antwort enthalten sein. Sehen Sie sich diesen Artikel an:

Effektive Fehlerbehandlung mit WCF & amp; RUHE

    
Enrico Campidoglio 05.04.2010 14:00
quelle
3

Der InnerException von ProtocolException ist ein WebException . Sie können das HttpWebResponse von diesem abrufen und GetResponseStream aufrufen, um den tatsächlichen Antworttext zu lesen. (Denken Sie daran, vor dem Lesen den Anfang des Streams zu suchen).

%Vor%     
JacquesB 07.01.2014 09:50
quelle
1

Meine zwei Cents sind, dass WCF gut darin ist, dieselbe Klasse mit vielen verschiedenen Bindungen zu exponieren. Verwenden Sie bei der Kommunikation mit C # eine SOAP-Bindung, die für Ausnahmeinformationen geeignet ist. Wenn Sie die REST-Stilbindung verwenden müssen, können Sie eine einfache WebRequest verwenden, um den Service aufzurufen, und den JSON-Serializer zum Deserialisieren der Ergebnisse verwenden. Dadurch erhalten Sie auch direkten Zugriff auf den Antwortcode.

    
Nate Zaugg 29.04.2010 16:03
quelle
1

Der von user653761 beschriebene Ansatz funktioniert für mich; nach Zugriff auf das Objekt HttpWebResponse kann ich die Klasse DataContractSerializer wie folgt verwenden:

%Vor%

Ich denke, das würde für alles funktionieren, was WCF serialisieren kann, wenn Sie den richtigen Serializer verwenden, der (noch) nicht auf Leistung getestet wurde.

    
MH8 30.09.2011 09:39
quelle