10 Stimmen

WCF-Fehlerausnahme zeigt keine Details auf dem Client für Seifendienst an

Wir haben REST- und SOAP-Endpunkte für unseren Dienst, also verwenden wir WebFaultException, um freundliche Nachrichten zu übermitteln. Das funktioniert für die REST-Aufrufe hervorragend, für die SOAP-Aufrufe nicht so sehr. Nachfolgend sehen Sie den Trace, der die freundliche Nachricht im Element "detail" deutlich zeigt. Aber die FaultException, die auf dem Client ausgelöst wird, hat die http-Statuscode-Beschreibung in der Nachricht - nicht die echte Nachricht, die vom Dienst ausgelöst wird. Gibt es eine Möglichkeit, die beabsichtigte Nachricht auf dem Client anzuzeigen?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header></s:Header>
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault" xmlns="">a:BadRequest</faultcode>
         <faultstring xml:lang="en-US" xmlns="">Bad Request</faultstring>
         <detail xmlns="">
            <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Country code must be 3 characters.</string>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

Außerdem ist dies in .net 4.0 und wir sind mit Castle WCF Anlage (DefaultServiceModel und RestServiceModel).

13voto

marc_s Punkte 701497

WCF meldet aus Sicherheitsgründen standardmäßig keine detaillierten Fehlerinformationen zurück. Es wird Ihnen im Grunde nur sagen: "Auf dem Server ist etwas schief gelaufen - Pech gehabt".

Sie können - für Entwicklungs- und Testzwecke - detailliertere Fehlerinformationen aktivieren, sollten dies aber für die Produktion deaktivieren.

Um dies zu ermöglichen, verwenden Sie ein Dienstverhalten auf Ihrem Server:

<system.serviceModel>
   <behaviors>
      <serviceBehaviors>
         <behavior name="DetailedDebugging">
             <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
      </serviceBehaviors>
   </behaviors>

   <services>
      <service name="YourService"
               behaviorConfiguration="DetailedDebugging" >
          ....
      </service>
   </services>
</system.serviceModel>

Jetzt sollte Ihr Dienst den detaillierten SOAP-Fehler mit allen Einzelheiten an Ihre Client-Anwendung zurückmelden.

Aktualisierung: Wenn ich mich richtig erinnere, wird bei der Bearbeitung eines standardmäßigen (nicht typisierten) FaultException haben Sie einfachen Zugang zu Dingen wie dem FaultCode y FaultReason usw., aber die Details der Nachricht sind ein wenig umständlich, um sie zu erhalten - versuchen Sie etwas wie dies:

try
{
   // your service call here
}
catch(FaultException fe)
{
   FaultCode fc = fe.Code;
   FaultReason fr = fe.Reason;

   MessageFault mf = fe.CreateMessageFault();
   if(mf.HasDetail)
   {
      string detailedMessage = mf.GetDetail<string>();
   }
}

Haben Sie dadurch Zugriff auf die detaillierte Beschreibung Ihres SOAP-Fehlers?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X