poniedziałek, 11 lutego 2013

70-513 Kontrakty

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:
//IService1
        [OperationContract]
        [FaultContract(typeof (string))]
        string GetSomeData(int id);

//Service1
        public string GetSomeData(int id)
        {
            if (id < 1)
            {
                throw new FaultException<string>("Id can't be less than 1");
            }

            return "Ok";
        }

2 komentarze:

  1. Wkradł się chyba błąd:
    Podstawowym atrybutem nakładanym w tej kategorii jest OperationContract.
    i zaraz potem:
    Kolejnym atrybutem który możemy zastosować to OperationContract.

    W pierwszym zdaniu powinno być raczej ServiceContract.

    OdpowiedzUsuń