Sdílet prostřednictvím


Smlouva o závadách

Ukázka Chyb ukazuje, jak komunikovat informace o chybách ze služby klientovi. Ukázka je založená na začínáme s dalším kódem přidaným do služby, který převede vnitřní výjimku na chybu. Klient se pokouší provést dělení nulou, aby způsobil chybu ve službě.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Kontrakt kalkulačky byl upraven tak, aby zahrnoval, FaultContractAttribute jak je znázorněno v následujícím vzorovém kódu.

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

Atribut FaultContractAttribute označuje, že Divide operace může vrátit chybu typu MathFault. Chyba může být jakéhokoli typu, který lze serializovat. V tomto případě se jedná MathFault o kontrakt dat, jak je znázorněno níže:

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

Metoda Divide vyvolá FaultException<TDetail> výjimku, když dojde k dělení nulou, jak je znázorněno v následujícím vzorovém kódu. Výsledkem této výjimky je odeslání chyby klientovi.

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

Kód klienta způsobí chybu požadováním dělení nulou. Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Vidíte dělení nulou, které je hlášeno jako chyba. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

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.

Klient to provede zachycením příslušné FaultException<MathFault> výjimky:

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

Ve výchozím nastavení se podrobnosti o neočekávaných výjimkách neodesílají klientovi, aby zabránily podrobnostem implementace služby v úniku zabezpečené hranice služby. FaultContract poskytuje způsob, jak popsat chyby ve smlouvě a označit určité typy výjimek podle potřeby pro přenos do klienta. FaultException<T> poskytuje mechanismus modulu runtime pro odesílání chyb příjemcům.

Při ladění je ale užitečné zobrazit interní podrobnosti o selhání služby. Chcete-li vypnout dříve popsané zabezpečené chování, můžete označit, že podrobnosti o každé neošetřené výjimce na serveru by měly být zahrnuty do chyby odeslané klientovi. Toho lze dosáhnout nastavením IncludeExceptionDetailInFaults na true. Můžete ho buď nastavit v kódu, nebo v konfiguraci, jak je znázorněno v následující ukázce.

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

Dále musí být chování asociováno se službou tím, že nastavíte atribut behaviorConfiguration této služby v konfiguračním souboru na "CalculatorServiceBehavior".

Aby bylo možné takové chyby zachytit na klientovi, musí být zachyceny jiné než obecné FaultException .

Toto chování by mělo být použito pouze pro účely ladění a nikdy by nemělo být povolené v produkčním prostředí.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.