Frage

Ich habe einen einfachen WCF-HTTP/SOAP-Webdienst, die Dienstimplementierung sieht etwa so aus:

public CustomResponse DoSomething(CustomRequest request)
{
    try
    {
        return InternalGubbins.WithErrorHandling.ProcessRequest(request);
    }
    catch
    {
        // Some sort of error occurred that is not gracefully
        // handled elsewhere in the framework
        throw new SoapException("Hmmm, it would seem that the cogs are meshed!", SoapException.ServerFaultCode);
    }
}

Wenn nun diese SoapException ausgelöst wird, möchte ich die Ausnahmemeldung (d. h. Hmmm, it would seem that the cogs are meshed!), die ohne zusätzliche Ausnahmedetails (d. h.Stapelspuren).

Wenn ich setze includeExceptionDetailInFaults auf true setzen (web.config auf dem Server), dann wird die vollständige Ausnahme mit Stack-Traces usw. an den Client zurückgegeben.Wenn ich es jedoch auf „false“ setze, erhalte ich eine allgemeine Meldung:

Der Server konnte die Anforderung aufgrund eines internen Fehlers nicht verarbeiten.Weitere Informationen zum Fehler erhalten Sie entweder includexceptionDetailInfaults (entweder von ServiceBehaviorAttribute oder aus dem Konfigurationsverhalten) auf dem Server, um die Ausnahmeinformationen an den Client zurück zu senden, oder die Verfolgung gemäß der Microsoft .NET -Framework 3.0 SDK -Dokumentation einschalten und überprüfen Sie die Server -Trace -Protokolle.

Die Frage ist also: Wie kann ich meine SoapException-Nachricht an den aufrufenden Client zurücksenden?d.h.:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="1">http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault</a:Action>
        <a:RelatesTo>urn:uuid:185719f4-6113-4126-b956-7290be375342</a:RelatesTo>
    </s:Header>
    <s:Body>
        <s:Fault>
            <s:Code>
                <s:Value>s:Receiver</s:Value>
                <s:Subcode>
                    <s:Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</s:Value>
                </s:Subcode>
            </s:Code>
            <s:Reason>
                <s:Text xml:lang="en-GB">Hmmm, it would seem that the cogs are meshed!</s:Text>
            </s:Reason>
        </s:Fault>
    </s:Body>
</s:Envelope>
War es hilfreich?

Lösung

Ich denke, Sie müssen einen FaultContract für den Vorgang deklarieren und FaultException verwenden (SoapException ist vor WCF).Ich bin davon überzeugt, dass WCF Fehler nicht an den Kunden zurücksendet, wenn diese nicht Teil des Servicevertrags sind.Ich habe SoapException noch nie ausprobiert, aber das Auslösen einer FaultException hat bei mir auf jeden Fall immer gut funktioniert.

[ServiceContract()]    
public interface ISomeService
{
     [OperationContract]
     [FaultContract(typeof(MyFault))]
     CustomResponse DoSomething(CustomRequest request)
}

public class SomeService
{
    public CustomResponse DoSomething(CustomRequest request)
    {
        ...
        throw new FaultException<MyFault>(new MyFault());
    }
}

Andere Tipps

Wenn Sie keinen benutzerdefinierten Ausnahmetyp definieren möchten, versuchen Sie Folgendes

try    
{        
    return InternalGubbins.WithErrorHandling.ProcessRequest(request);    
}    
catch    
{
    throw new FaultException("Hmmm, it would seem that the cogs are meshed.");    
}

Dies würde die folgende Antwort an den Client senden

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <s:Fault>
      <faultcode>s:Client</faultcode>
      <faultstring xml:lang="en-US">Hmmm, it would seem that the cogs are meshed.</faultstring>
    </s:Fault>
  </s:Body>
</s:Envelope>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top