Dela via


Felansvarskontrakt

Exemplet Fel visar hur du kommunicerar felinformation från en tjänst till en klient. Exemplet baseras på Komma igång med ytterligare kod som lagts till i tjänsten för att konvertera ett internt undantag till ett fel. Klienten försöker utföra division med noll för att framtvinga ett feltillstånd för tjänsten.

Anmärkning

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Kalkylatorkontraktet har ändrats så att det inkluderar ett FaultContractAttribute som visas i följande exempelkod.

[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);
}

Attributet FaultContractAttribute anger att åtgärden Divide kan returnera ett fel av typen MathFault. Ett fel kan vara av vilken typ som helst som kan serialiseras. I det här fallet MathFault är ett datakontrakt enligt följande:

[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; }
    }
}

Metoden Divide utlöser ett FaultException<TDetail> undantag när ett dividerat med nollundantag inträffar enligt följande exempelkod. Det här undantaget resulterar i att ett fel skickas till klienten.

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);
    }
}

Klientkoden tvingar fram ett fel genom att begära en division med noll. När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Du ser att divisionen med noll rapporteras som ett fel. Tryck på RETUR i klientfönstret för att stänga av klienten.

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.

Klienten gör detta genom att fånga rätt FaultException<MathFault> undantag:

catch (FaultException<MathFault> e)
{
    Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
    client.Abort();
}

Som standard skickas inte information om oväntade undantag till klienten för att förhindra att information om tjänstimplementeringen undviker tjänstens säkra gräns. FaultContract ger ett sätt att beskriva fel i ett kontrakt och markera vissa typer av undantag som lämpliga för överföring till klienten. FaultException<T> tillhandahåller utförandemekanismen för att överföra fel till konsumenter.

Det är dock användbart att se intern information om ett tjänstfel vid felsökning. Om du vill inaktivera det säkra beteende som beskrivits tidigare kan du ange att information om varje ohanterat undantag på servern ska ingå i felet som skickas till klienten. Detta åstadkoms genom att ange IncludeExceptionDetailInFaults till true. Du kan antingen ange den i kod eller i konfigurationen enligt följande exempel.

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Dessutom måste beteendet associeras med tjänsten genom att ange behaviorConfiguration attributet för tjänsten i konfigurationsfilen till "CalculatorServiceBehavior".

För att fånga sådana fel på klienten måste den icke-generiska FaultException fångas.

Det här beteendet bör endast användas för felsökning och bör aldrig aktiveras i produktion.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört One-Time installationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.