Chyba – kontrakt
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 pokusí provést dělení nulou, aby vynutil 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, pokud dojde k dělení nulou výjimka, 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 vynutí chybu vyžádá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. Zobrazí se dělení nulou, která se hlásí 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 běhu 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í přidružené ke službě nastavením behaviorConfiguration
atributu 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í.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.