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?
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%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:
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.
Der von user653761 beschriebene Ansatz funktioniert für mich; nach Zugriff auf das Objekt HttpWebResponse
kann ich die Klasse DataContractSerializer
wie folgt verwenden:
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.
Tags und Links wcf .net rest channelfactory protocolexception