Egzamin 70-513 dotyczy technologi WCF - Windows Communication Foundation. Technologia ta umożliwia deweloperowi budować aplikacje zorientowane na usługi.
Pierwszym, ważnym aspektem serwisu stworzonego w WCF jest zdefiniowanie kontraktów. Określają one między innymi format wysyłanej wiadomości, odpowiedź na nią. Odpowiadają także na pytanie co w razie błędów. Definiujemy trzy rodzaje kontraktów, które zostaną kolejno omówione.
Behavioral Contracts
Behavioral Contracts określają w jaki sposób zachowuje się serwis. Podstawowym atrybutem nakładanym w tej kategorii jest
ServiceContract. Atrybut ten dodajemy do klasy bądź interfejsu - ze szczególnym naciskiem na interfejs (jest to bardziej eleganckie rozwiązanie). Atrybut ten posiada szereg właściwości:
- Name - nazwa kontraktu - domyślnie jest to nazwa interfejsu bądź klasy. Nazwa ta jest później używana w polu portType aplikacji, która konsumuje serwis
- Namespace - przestrzeń nazw dla definicji WSDL
- CallbackContract - interfejs biorący udział w przypadku komunikacji dwustronnej (duplex)
- ProtectionLevel - decyduje o tym w jaki sposób są chronione wiadomości (szyfrowanie, podpis cyfrowy)
- ConfigurationName - nazwa konfiguracji w pliku konfiguracyjnym (web.config/app.config)
- SessionMode - konfiguracja sesji
Kolejnym atrybutem który możemy zastosować to
OperationContract. Atrybut ten służy m.in. do definiowania sposobu ekspozycji metod, formatu wiadomości. Niektóre możliwe parametry do ustawienia:
- Name - nazwa operacji - domyślnie nazwa metody
- Action - nagłówek akcji
- ReplyAction - nagłówek odpowiedzi
- IsOneWay - definiuje czy akcja jest tylko w jedną stornię - nie jest wtedy brany pod uwagę nagłówek zdefiniowany w ReplyAction
- ProtectionLevel - szyfrowanie dla pojedynczej metody
- IsInitiating - definiuje czy wywołanie tej metody tworzy nową sesję pomiędzy wywołującym a serwisem
- IsTerminating - definiuje czy wywołanie tej metody kończy istniejącą sesję
W przypadku
Action można użyć jako nazwy "*", co będzie oznaczą, że w przypadku podania błędnej nazwy zostanie wywołana metoda oznaczona gwiazdką:
Code:
[OperationContract(Action = "*")]
void DoSomething(Message message);
Kolejnym możliwym atrybutem do nadania jest
MessageParameter. Określa on w jaki sposób nazwy zmiennych przekazywanych do operacji są nazwane w XMLu powstałym w wyniku serializacji obiektów.
Przykład:
Code:
[OperationContract()]
[return: MessageParameter(Name = "responseString")]
string SomeOp([MessageParameter(Name = "string")]string s);
Fault Contracts
Kontrakt tego typu opisuje co w przypadku błędów w serwisie zostanie wysłane do klienta. Należy sobie uświadomić, że
Fault to nie jest to samo co
Exception.
Exception to główny sposób powiadamiania w .NET o błędach podczas wykonywania aplikacji.
Fault to wiadomość o błędzie w kontekście protokołu SOAP.
WCF posiada klasę
FaultException, którą można traktować jako obiekt Proxy pomiędzy światem web serwisem a platformą .NET. Klasa
FualtException posiada dwie wersje:
- FaultException - nietypowany wyjątek
- FaultException<TDetail> - generyczna wersja wyjątku
Najważniejsze fakty nt.
FaultException:
- atrybut można nałożyć tylko na operacje
- atrybut ten nie jest dziedziczony
- może być nałożony na operację kilka razy (np. w celu zaznaczenia iż metoda może rzucić kilka różnych rodzajów wyjątków)
- konstruktor przyjmuje typ wyjątku
Przykład implementacji:
Code:
[OperationContract]
[FaultContract(typeof (string))]
string GetSomeData(int id);
public string GetSomeData(int id)
{
if (id < 1)
{
throw new FaultException<string>("Id can't be less than 1");
}
return "Ok";
}