Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
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.