Foutcontract
Het voorbeeld van fouten laat zien hoe u foutinformatie van een service naar een client communiceert. Het voorbeeld is gebaseerd op aan de slag, waarbij er extra code aan de service is toegevoegd om een interne uitzondering naar een fout te converteren. De client probeert deling door nul uit te voeren om een foutvoorwaarde voor de service af te dwingen.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
Het rekenmachinecontract is aangepast om een FaultContractAttribute zoals weergegeven in de volgende voorbeeldcode op te nemen.
[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);
}
Het FaultContractAttribute kenmerk geeft aan dat de Divide
bewerking een fout van het type MathFault
kan retourneren. Een fout kan van elk type zijn dat kan worden geserialiseerd. In dit geval is het MathFault
een gegevenscontract, als volgt:
[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; }
}
}
De Divide
methode genereert een FaultException<TDetail> uitzondering wanneer een scheiding door nuluitzonderingen plaatsvindt, zoals wordt weergegeven in de volgende voorbeeldcode. Deze uitzondering resulteert in een fout die naar de client wordt verzonden.
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);
}
}
De clientcode dwingt een fout af door een deling door nul aan te vragen. Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het clientconsolevenster. U ziet dat de deling door nul wordt gerapporteerd als een fout. Druk op Enter in het clientvenster om de client af te sluiten.
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.
De client doet dit door de juiste FaultException<MathFault>
uitzondering te ondervangen:
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
client.Abort();
}
Standaard worden de details van onverwachte uitzonderingen niet naar de client verzonden om te voorkomen dat details van de service-implementatie ontsnappen aan de veilige grens van de service. FaultContract
biedt een manier om fouten in een contract te beschrijven en bepaalde soorten uitzonderingen te markeren, indien nodig voor verzending naar de client. FaultException<T>
biedt het runtimemechanisme voor het verzenden van fouten naar consumenten.
Het is echter handig om de interne details van een servicefout te zien bij foutopsporing. Als u het eerder beschreven veilige gedrag wilt uitschakelen, kunt u aangeven dat de details van elke niet-verwerkte uitzondering op de server moeten worden opgenomen in de fout die naar de client wordt verzonden. Dit wordt bereikt door de instelling in te stellen IncludeExceptionDetailInFaults op true
. U kunt deze instellen in code of in de configuratie, zoals wordt weergegeven in het volgende voorbeeld.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
Verder moet het gedrag aan de service worden gekoppeld door het behaviorConfiguration
kenmerk van de service in het configuratiebestand in te stellen op 'CalculatorServiceBehavior'.
Om dergelijke fouten op de client te ondervangen, moet de niet-generieke FaultException worden betrapt.
Dit gedrag mag alleen worden gebruikt voor foutopsporingsdoeleinden en mag nooit in productie worden ingeschakeld.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.