WCF - Ausnahmebehandlung
Ein WCF-Serviceentwickler kann auf einige unvorhergesehene Fehler stoßen, die eine geeignete Berichterstattung an den Client erfordern. Solche Fehler, bekannt alsexceptionswerden normalerweise mit Try / Catch-Blöcken behandelt, aber auch dies ist sehr technologiespezifisch.
Da es im Problembereich eines Clients nicht darum geht, wie ein Fehler aufgetreten ist oder welche Faktoren zu einem Fehler beitragen, wird der SOAP-Fehlervertrag verwendet, um die Fehlermeldung vom Dienst an den Client in WCF zu übermitteln.
Ein Fehlervertrag ermöglicht es dem Kunden, eine dokumentierte Ansicht der in einem Service aufgetretenen Fehler zu erhalten. Das folgende Beispiel gibt ein besseres Verständnis.
Step 1 - Mit der Divide-Operation wird ein einfacher Rechnerservice erstellt, der allgemeine Ausnahmen generiert.
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;
namespace Calculator {
// NOTE: You can use the "Rename" command on the "Refactor" menu to change
// the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IService1 {
[OperationContract]
int divide(int num1, int num2);
// TODO: Add your service operations here
}
}
Die Codierung für die Klassendatei ist unten dargestellt -
Wenn wir nun versuchen, die Zahl 10 durch Null zu teilen, löst der Rechnerservice eine Ausnahme aus.
Die Ausnahme kann durch den try / catch-Block behandelt werden.
Wenn wir nun versuchen, eine Ganzzahl durch 0 zu teilen, wird der Wert 10 zurückgegeben, da wir ihn im catch-Block behandelt haben.
Step 2 - In diesem Schritt wird FaultException verwendet, um die Ausnahmeinformationen vom Dienst an den Client zu übermitteln.
public int Divide(int num1, int num2) {
//Do something
throw new FaultException("Error while dividing number");
}
Step 3- Es ist auch möglich, einen benutzerdefinierten Typ zum Senden der Fehlermeldung mit FaultContract zu erstellen. Die Schritte zum Erstellen eines benutzerdefinierten Typs sind nachstehend aufgeführt:
Ein Typ wird durch die Verwendung eines Datenvertrags definiert und die Felder, die zurückgegeben werden sollen, werden angegeben.
Die Serviceoperation wird durch das Attribut FaultContract dekoriert. Der Typname wird ebenfalls angegeben.
Eine Dienstinstanz wird erstellt, um Ausnahmen auszulösen, und benutzerdefinierte Ausnahmeeigenschaften werden zugewiesen.