Wie Behandeln WCF-Fault Exception
Ich bin versuchen, um mehr Informationen über einen SOAP-Fehler in einer open-source-client-Anwendung. Das client-setup aufrufen "HandleFault" Wann immer es trifft auf alle SOAP-Fehler. Der Griff-Fehler-Methode ist unten dargestellt:
public static void HandleFault(Message message) {
MessageFault fault = MessageFault.CreateFault(message, Int32.MaxValue);
throw System.ServiceModel.FaultException.CreateFault(fault,
typeof(PermissionDeniedFault),
typeof(EndpointUnavailable),
typeof(InvalidRepresentation),
typeof(UnwillingToPerformFault),
typeof(CannotProcessFilter),
typeof(AnonymousInteractionRequiredFault)
);
}
Hier ist ein Teil der SOAP-Fault, der übergeben wird als "Nachricht", wenn ich versuchen und etwas tun, wie das ändern eines Telefon-Nummer ungültiges format von der client.
<s:Body u:Id="_2">
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope">
<Code>
<Value>Sender</Value>
<Subcode>
<Value xmlns:a="http://schemas.xmlsoap.org/ws/2004/09/transfer">a:InvalidRepresentation</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">The request message contains errors that prevent processing the request.</Text>
</Reason>
<Detail>
<RepresentationFailures xmlns="http://schemas.microsoft.com/2006/11/ResourceManagement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AttributeRepresentationFailure>
<AttributeType>OfficePhone</AttributeType>
<AttributeValue>(123)456-7890</AttributeValue>
<AttributeFailureCode>ValueViolatesRegularExpression</AttributeFailureCode>
<AdditionalTextDetails>The specified attribute value does not satisfy the regular expression.</AdditionalTextDetails>
</AttributeRepresentationFailure>
<CorrelationId>11042dda-3ce9-4563-b59e-d1c1355819a4</CorrelationId>
</RepresentationFailures>
</Detail>
</Fault>
Wann ein Fehler aufgetreten ist, der client nur zurück, "Die request-Nachricht enthält Fehler, die verhindern, dass die Verarbeitung der Anfrage.", Ich würde gerne die "AttributeRepresentationFailure" - Knoten und Kind-Knoten, bevor Sie wieder das werfen der exception im client.
Ich verstehe es so ist, dass ich brauche, um zu definieren, eine Fehlerklasse, die enthält alle details werden deseralized, so dass der Aufruf zu "CreateFault" zurückgeben kann . Ich habe gelesen, durch http://msdn.microsoft.com/en-us/library/ms733841.aspx aber ich verstehe einfach nicht genau, wie die Klasse definiert wird, so dass der client weiß, welche Art von Fehler wird geworfen.
UPDATE
In der client-side handle-Fehler-Methode, die ich Hinzugefügt
try
{
throw faultexcept;
}
catch (System.ServiceModel.FaultException<InvalidRepresentation> invalidRepresentationFault)
{
throw invalidRepresentationFault;
}
catch (System.ServiceModel.FaultException otherFault)
{
throw otherFault;
}
catch (Exception ex)
{
throw ex;
}
Der Fehler ist immer gefangen unter den base-Fehler-Klasse "otherFault".
Meine InvalidRepresentation Klasse ist wie folgt definiert
[DataContract(Namespace = Constants.Rm.Namespace)]
public class InvalidRepresentation
{
private string _attributeType;
private string _attributeValue;
private string _attributeFailureCode;
private string _additionalTextDetails;
[DataMember]
public string AttributeType
{
get { return _attributeType; }
set { _attributeType = value; }
}
[DataMember]
public string AttributeValue
{
get { return _attributeValue; }
set { _attributeValue = value; }
}
[DataMember]
public string AttributeFailureCode
{
get { return _attributeFailureCode; }
set { _attributeFailureCode = value; }
}
[DataMember]
public string AdditionalTextDetails
{
get { return _additionalTextDetails; }
set { _additionalTextDetails = value; }
}
public InvalidRepresentation() {
}
}
InformationsquelleAutor The Unique Paul Smith | 2013-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen Fredrik Antwort, deine Schuld Klasse kann alles sein, was Sie brauchen, um zu vermitteln, die details der benutzerdefinierten Fehler an den client. Sie nicht haben, um Erben von einer anderen Klasse oder eine Schnittstelle implementieren. Es muss nur gekennzeichnet werden, mit dem DataContract-Attribut.
Als für den Fang es auf der client-Seite:
Auf der service-Seite, werden Sie werfen die Schuld in der Weise, dass Fredrik unten beschrieben?
throw new FaultException<InvalidRepresentation>(yourFault);
InformationsquelleAutor Jason
War ich endlich in der Lage, um eine Lösung zu finden, um diese, Dank an alle, die geholfen haben! Dies ist nicht die beste Lösung und muss gereinigt werden, aber es funktioniert Weile, bis ich weitere Informationen über WCF-und SOAP-Fehler. Auch ich habe keinen Zugriff zu den service-code, nur den client-code. Der client-code wird lief als powershell-Modul.
InvalidRepresentationFault Klasse
}
Client HandleFault Code
Nun, wenn der service wirft eine SOAP Fault es wird deserialisiert in der "RepresentationFailures" - Klasse, die ich anpassen können, bevor Sie wieder zurück werfen upstream (in diesem Fall powershell)
Werfen Sie keine Ausnahme. Erstellen Sie Ihre eigenen benutzerdefinierten Ausnahme, und übergeben Sie was Sie brauchen.
InformationsquelleAutor The Unique Paul Smith
Ich bin mit dem Mathe-Beispiel aus dem Artikel, den Sie bezeichnet. Erstellen Sie die Fehler-Klasse:
Dekorieren Sie Ihre Methode mit OperationContract, z.B.
Erstellen Sie Ihre MathFault Objekt mit sensiblen Daten. Wickeln Sie es und werfen Sie es:
Hoffe, das hilft.
System.ServiceModel.FaultException.CreateFault
code?InformationsquelleAutor Fredrik