Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A Hibaminta bemutatja, hogyan közölhet hibainformációkat egy szolgáltatásból egy ügyfélnek. A minta az első lépéseken alapul, és hozzáadtunk néhány további kódot a szolgáltatáshoz, hogy egy belső kivételt hibaként alakítsunk át. Az ügyfél nullával való osztást kísérel meg végrehajtani, hogy hibát generáljon a szolgáltatásban.
Megjegyzés:
A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.
A kalkulátorszerződés úgy lett módosítva, hogy az a következő mintakódban látható módon szerepeljen FaultContractAttribute .
[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);
}
Az FaultContractAttribute attribútum azt jelzi, hogy a Divide művelet típushibát MathFaultadhat vissza. A hiba bármilyen típusú lehet, amely szerializálható. Ebben az esetben az MathFault adatszerződés az alábbiak szerint történik:
[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; }
}
}
A Divide metódus egy FaultException<TDetail> kivételt dob, amikor nullával való osztás történik, amint az az alábbi mintakódban látható. Ez a kivétel azt eredményezi, hogy a rendszer hibát küld az ügyfélnek.
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);
}
}
Az ügyfélkód nullával történő osztás kérésével kényszeríti ki a hibát. A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Nullával való osztás hibaként kerül jelentésre. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.
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.
Az ügyfél ezt a megfelelő FaultException<MathFault> kivétel elfogásával teszi:
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
client.Abort();
}
Alapértelmezés szerint a váratlan kivételek részleteit a rendszer nem küldi el az ügyfélnek, hogy megakadályozza a szolgáltatás implementációjának részleteit a szolgáltatás biztonságos határának elkerülésében.
FaultContract lehetővé teszi a szerződés hibáinak leírását, valamint az ügyfélnek való továbbításhoz szükséges bizonyos típusú kivételek megjelölését.
FaultException<T> biztosítja a futtatókörnyezeti mechanizmust a hibák fogyasztóknak való küldéséhez.
Hibakereséskor azonban hasznos látni a szolgáltatáshibák belső részleteit. A korábban ismertetett biztonságos viselkedés kikapcsolásához jelezheti, hogy a kiszolgáló minden kezeletlen kivételének részleteit bele kell foglalnia az ügyfélnek küldött hibába. Ez úgy érhető el, hogy a IncludeExceptionDetailInFaults értéke true-re van állítva. Beállíthatja kódban vagy konfigurációban az alábbi példában látható módon.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
Emellett a viselkedést a szolgáltatáshoz kell társítani, ha a behaviorConfiguration konfigurációs fájlban lévő szolgáltatás attribútumát a "CalculatorServiceBehavior" értékre állítja.
Az ilyen hibák elkapásához az ügyfél oldalán a nem generikus FaultException hibát kell elkapni.
Ezt a viselkedést csak hibakeresési célokra szabad használni, és soha nem szabad engedélyezni az éles környezetben.
A példa beállítása, elkészítése és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.