FaultException<TDetail>-Klasse
Aktualisiert: November 2007
Wird in einer Clientanwendung verwendet, um vertraglich angegebene SOAP-Fehler abzufangen.
Assembly: System.ServiceModel (in System.ServiceModel.dll)
Fangen Sie das FaultException<TDetail>-Objekt in einer Windows Communication Foundation (WCF)-Clientanwendung ab, um einen SOAP-Fehler zu verarbeiten, der vertraglich in einem Vorgangsvertrag angegeben wurde.
Normal bereitgestellte Dienste verwenden FaultContractAttribute, um alle SOAP-Fehler formal anzugeben, die bei einem Client während des normalen Betriebs eingehen können. Fehlerinformationen in FaultContractAttribute werden beim Eingang in der Clientanwendung als FaultException<TDetail> dargestellt, wobei der Typparameter das im FaultContractAttribute des Vorgangs angegebene Fehlerobjekt ist. Das FaultContractAttribute kann zur Angabe der SOAP-Fehler für bidirektionale Dienstmethoden und für asynchrone Methodenpaare verwendet werden.
Da es sich bei FaultException<TDetail> sowohl um eine FaultException und somit auch um eine CommunicationException handelt, müssen Sie, um bestimmte SOAP-Fehler abzufangen, sicherstellen, dass Sie die FaultException<TDetail>-Typen vor dem FaultException-Typ und dem CommunicationException-Typ abfangen oder dass Sie die angegebenen Ausnahmen mit einem der Ausnahmehandler verarbeiten.
Hinweis: |
|---|
Wenn Sie ein System.ServiceModel.FaultContractAttribute verwenden, um eine FaultException<TDetail> festzulegen, bei der der Typparameter ein System.String ist, wird der Zeichenfolgewert der Detail-Eigenschaft in der Clientanwendung zugeordnet; Clients können diese Zeichenfolge nicht durch Abrufen der FaultException<TDetail>.ToString-Methode abrufen. Damit der Zeichenfolgewert zurückgegeben wird, wenn die Clientanwendung Exception.ToString aufruft, lösen Sie im Vorgang eine System.ServiceModel.FaultException-Ausnahme aus, und übergeben Sie die Zeichenfolge dem Konstruktor. Im Allgemeinen wird empfohlen, dass als Detailtypen benutzerdefinierte serialisierbare und für den Fehler geeignete Typen verwendet werden und keine System.String. |
Das folgende Codebeispiel zeigt, wie ein Dienst den FaultException<TDetail>-Typ verwendet, um eine verwaltete Ausnahme auszulösen, die in den vom FaultContractAttribute angegebenen SOAP-Fehler konvertiert wird.
using System; using System.Collections.Generic; using System.Net.Security; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace Microsoft.WCF.Documentation { [ServiceContract(Namespace="http://microsoft.wcf.documentation")] public interface ISampleService{ [OperationContract] [FaultContractAttribute( typeof(GreetingFault), Action="http://www.contoso.com/GreetingFault", ProtectionLevel=ProtectionLevel.EncryptAndSign )] string SampleMethod(string msg); } [DataContractAttribute] public class GreetingFault { private string report; public GreetingFault(string message) { this.report = message; } [DataMemberAttribute] public string Message { get { return this.report; } set { this.report = value; } } } class SampleService : ISampleService { #region ISampleService Members public string SampleMethod(string msg) { Console.WriteLine("Client said: " + msg); // Generate intermittent error behavior. Random rand = new Random(DateTime.Now.Millisecond); int test = rand.Next(5); if (test % 2 != 0) return "The service greets you: " + msg; else throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg)); } #endregion } }
Das folgende Codebeispiel zeigt, wie der Clientcode aussieht, wenn er vom Client mithilfe von ServiceModel Metadata Utility-Tool (Svcutil.exe) importiert wird.
Das folgende Codebeispiel zeigt, wie ein Client den FaultException<TDetail>-Typ abfangen kann, der den im Vorgangsvertrag angegebenen benutzerdefinierten SOAP-Fehler darstellt.
using System; using System.ServiceModel; using System.ServiceModel.Channels; using Microsoft.WCF.Documentation; public class Client { public static void Main() { // Picks up configuration from the config file. SampleServiceClient wcfClient = new SampleServiceClient(); try { // Making calls. Console.WriteLine("Enter the greeting to send: "); string greeting = Console.ReadLine(); Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting)); Console.WriteLine("Press ENTER to exit:"); Console.ReadLine(); // Done with service. wcfClient.Close(); Console.WriteLine("Done!"); } catch (TimeoutException timeProblem) { Console.WriteLine("The service operation timed out. " + timeProblem.Message); Console.ReadLine(); wcfClient.Abort(); } catch (FaultException<GreetingFault> greetingFault) { Console.WriteLine(greetingFault.Detail.Message); Console.ReadLine(); wcfClient.Abort(); } catch (FaultException unknownFault) { Console.WriteLine("An unknown exception was received. " + unknownFault.Message); Console.ReadLine(); wcfClient.Abort(); } catch (CommunicationException commProblem) { Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace); Console.ReadLine(); wcfClient.Abort(); } } }
System.Exception
System.SystemException
System.ServiceModel.CommunicationException
System.ServiceModel.FaultException
System.ServiceModel.FaultException<TDetail>
Windows Vista, Windows XP SP2, Windows Server 2003
.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Hinweis: