2016-04-22 12 views
1

Ich habe einen WCF-Client für eine Reihe von Diensten in einem SAP-System. Bei bestimmten Fehlern können die Dienste (angeblich) keinen SOAP-Fehler zurückgeben. Stattdessen erhalte ich etwas in der Art:Wie wird mit einer Nicht-SOAP-Fehlermeldung verfahren?

<?xml version="1.0"?> 
<jpr:Fault xmlns:jpr="http://com.sap/aii/proxy/xiruntime/">com.sap.aii.proxy.xiruntime.core.ESPXISystemFaultException: Error encountered during processing of XI request message in inbound ESP; Hint: com.sap.engine.interfaces.webservices.runtime.RuntimeProcessException: Response did not arrive for request 8d4b2782-062a-11e6-b0f9-0000193763e3</jpr:Fault> 

Das obige Symbol steht für einen bestimmten Timeout-Typ im Service. Die einzige Information, die ich hier zur Verfügung habe, um sie als Timeout zu identifizieren, ist folgender Text: Response did not arrive for request

Es gibt WSDLs, aber der Hersteller nimmt sie nicht sehr ernst. Ich habe auch darum gebeten, mir einen SOAP-Fehler zu geben, aber sie bestehen darauf, dass es in diesem Fall nicht möglich ist.

Wie kann ich eine Nachricht wie diese behandeln? Derzeit erhalte ich diese Ausnahmekette:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. 
---> System.ServiceModel.CommunicationException: Unrecognized message version. 
+1

es Handle wie? Es scheint der einfachste Weg zu sein, den Aufruf in einen try-catch-Block zu setzen und die Ausnahme zu behandeln. – Tim

+0

@Tim eine TargetInvocationException abfangen ist zu breit, ich muss sicherstellen, dass ich nur diese spezifische Nachricht abfangen. – Stijn

Antwort

0

Es ist möglich, aber Sie müssen mit einigen Low-Level-Bits arbeiten. Der Ort, an dem Sie sein möchten, befindet sich in dem Client-Kanal, in dem Sie Ihre Komponente in dem Kanal installieren können, um diese Art von Antwort zu verarbeiten. Werfen Sie einen Blick auf WCF Extensibility – Channels, wo Sie finden können, wie Sie Ihren Protokollkanal erstellen.

Danach können Sie erstellen Ihre benutzerdefinierte Kanäle Aufstapeln Bindung, wo Sie Transport haben (muss vorhanden sein), Ihr Protokoll, Encoder, etc ...

+0

Was hat das mit der Behandlung eines Fehlers zu tun? – Tim

+0

Es gibt viele Möglichkeiten, den Fehler zu behandeln. Wenn Sie etwas als sinnvolle Nachricht an den Client zurückgeben möchten, statt als unerkannte Version. –

+0

Sicher, aber in diesem Fall scheint es, als ob ein einfacher Versuch-Fang den Trick machen würde, anstatt sich die Mühe zu machen, eine benutzerdefinierte Bindung zu schreiben. – Tim