Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio Faults illustra come comunicare le informazioni sugli errori da un servizio a un client. L'esempio si basa su Iniziare, con del codice aggiunto al servizio per convertire un'eccezione interna in un errore. Il client tenta di eseguire la divisione per zero per generare una condizione di errore nel servizio.
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Il contratto calcolatrice è stato modificato per includere un oggetto FaultContractAttribute come illustrato nel codice di esempio seguente.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
int Add(int n1, int n2);
[OperationContract]
int Subtract(int n1, int n2);
[OperationContract]
int Multiply(int n1, int n2);
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
}
L'attributo FaultContractAttribute indica che l'operazione Divide può restituire un errore di tipo MathFault. Un errore può essere di qualsiasi tipo che può essere serializzato. In questo caso, MathFault è un contratto dati, come indicato di seguito:
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
private string operation;
private string problemType;
[DataMember]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[DataMember]
public string ProblemType
{
get { return problemType; }
set { problemType = value; }
}
}
Il Divide metodo genera un'eccezione FaultException<TDetail> quando si verifica una eccezione di divisione per zero, come illustrato nel codice di esempio seguente. Questa eccezione genera un errore inviato al client.
public int Divide(int n1, int n2)
{
try
{
return n1 / n2;
}
catch (DivideByZeroException)
{
MathFault mf = new MathFault();
mf.operation = "division";
mf.problemType = "divide by zero";
throw new FaultException<MathFault>(mf);
}
}
Il codice client forza un errore richiedendo una divisione per zero. Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. La divisione per zero viene segnalata come errore. Premere INVIO nella finestra del client per chiudere il client.
Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
FaultException<MathFault>: Math fault while doing division. Problem: divide by zero
Press <ENTER> to terminate client.
A tale scopo, il client rileva l'eccezione appropriata FaultException<MathFault> :
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
client.Abort();
}
Per impostazione predefinita, i dettagli delle eccezioni impreviste non vengono inviati al client per impedire ai dettagli dell'implementazione del servizio di escapingere il limite sicuro del servizio.
FaultContract fornisce un modo per descrivere gli errori in un contratto e contrassegnare determinati tipi di eccezioni come appropriato per la trasmissione al client.
FaultException<T> fornisce il meccanismo di runtime per l'invio di errori ai consumer.
Tuttavia, è utile visualizzare i dettagli interni di un errore del servizio durante il debug. Per disattivare il comportamento di sicurezza descritto in precedenza, è possibile indicare che i dettagli di ogni eccezione non gestita nel server devono essere inclusi nell'errore inviato al client. Questa operazione viene eseguita impostando IncludeExceptionDetailInFaults su true. È possibile impostarlo nel codice o nella configurazione come illustrato nell'esempio seguente.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
Inoltre, il comportamento deve essere associato al servizio impostando l'attributo behaviorConfiguration del servizio nel file di configurazione su "CalculatorServiceBehavior".
Per intercettare tali errori nel client, è necessario intercettare il non generico FaultException .
Questo comportamento deve essere usato solo a scopo di debug e non deve mai essere abilitato nell'ambiente di produzione.
Per configurare, compilare ed eseguire l'esempio
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio in una configurazione con computer singolo o incrociato, seguire le istruzioni riportate in Esecuzione degli esempi di Windows Communication Foundation.