Ich versuche, weitere Informationen zu einem SOAP-Fehler in einer Open-Source-Clientanwendung hinzuzufügen. Der Client ist so eingerichtet, dass er "HandleFault" aufruft, wenn ein SOAP-Fehler auftritt. Der Griff Fehler Methode ist unten dargestellt:Behandeln der WCF-Fehlerausnahme
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-Fehler, die als „Nachricht“ wird übergeben, wenn ich versuche und eine Telefonnummer zu einem ungültigen Format von der Client etwas wie ändern.
<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>
Jedes Mal, wenn die Störung aufgetreten ist, kehrt der Client nur zurück „Die Anforderungsnachricht Fehler enthält, der die Anforderung verhindern Verarbeitung.“ Ich möchte die „AttributeRepresentationFailure“ Knoten und Kind einschließen Knoten vor dem erneuten Auslösen der Ausnahme im Client.
Die Art, wie ich es verstehe, ist, dass ich eine Fehlerklasse definieren muss, die die zu deserialisierenden Details enthält, so dass der Aufruf von "CreateFault" ein zurückgeben kann. Ich habe http://msdn.microsoft.com/en-us/library/ms733841.aspx gelesen, aber ich verstehe einfach nicht genau, wie man die Klasse definiert, damit der Client weiß, welche Art von Fehler ausgelöst wird.
UPDATE
Im Griff Fehler Methode Client-Seite hinzugefügt I
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 immer unter dem Basisfehlerklasse "otherFault" gefangen wird. Meine InvalidRepresentation Klasse ist definiert als unter
[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() {
}
}
danke! Ich denke, ich bin auf dem richtigen Weg, aber wenn ich meine Fehlerklasse definiere, wie muss diese Klasse aussehen, um den Fehler in dem Beispiel, das ich oben gesendet habe, richtig zu behandeln? Außerdem, wie in der Client-Code ich bestimmen, welche Fehler ausgelöst wurde, nehme ich an, dass im 'System.ServiceModel.FaultException.CreateFault' Code behandelt wird? –