Artykuł pochodzi w serii przygotowań do egzaminu 70-562 ASP.NET.
W dzisiejszym artykule będzie na temat tworzenia i korzystania z web serwisów wykorzystujących technologię Windows Communication Foundation. Artykuł będzie wprowadzeniem do tej technologii. Jeśli ktoś będzie bardziej zainteresowany nią, to po więcej informacji odsyłam do równoległej serii artykułów przygotowujących do egzaminu właśnie z WCFa.
Windows Communication Foundation to technologia, która po raz pierwszy pojawiła się wraz z wersją 3.0 .NET Frameworka. WCF jest to zunifikowany model programistyczny do wszelkiego rodzaju komunikacji rozproszonej. Dzięki WCFowi identycznie pracujemy z różnymi sposobami przesyłania danych przez sieć, niezależnie, czy fizycznie wykorzystujemy połączenia TCP, czy na przykład protokół HTTP i SOAPa.
W artykule tak jak już pisałem skupie się na podstawach, a dokładniej pokaże jak tworzyć serwis WCFa oraz jak go wykorzystywać w aplikacjach ASP.NET.
Aby stworzyć i korzystać z serwisu napisanego w WCFie, trzeba zrobić kilka kroków:
- Zdefiniować kontrakt serwisu
- Zaimplementować ten kontrakt
- Skonfigurować punkty dostępowe serwisu
- Hostować serwis
- Dodać referencje do serwisu w aplikacji klienckiej i go wykorzystywać
W Visual Studio jest specjalny typ projektu, który umożliwia stworzenie serwisu Windows Communication Foundation – WCF Service Application. Po stworzeniu tego typu projektu mamy domyślnie dodane między innymi dwa pliki: IService1.cs oraz Service1.svc, w których odpowiednio znajduje się kontrakt serwisu oraz jego implementacja.
Przeglądając zawartość pliku IService1.cs można zauważyć, że znajduje się tam jeden interfejs oraz jedna klasa. Od razu rzuca się w oczy, że sam interfejs i klasa są oznaczone specjalnymi atrybutami oraz metody i właściwości też są oznaczone. W WCFie, aby zdefiniować kontrakt wykorzystuje się atrybuty. Mamy 4 podstawowe atrybuty:
- ServiceContract – za jego pomocą oznacza się interfejs lub klasę, która ma definiować kontrakt serwisu WCFowego. Atrybut ten może przyjmować parametry, za pomocą których można zdefiniować właściwości serwisu.
- OperationContract – atrybut ten służy do oznaczania metod w interfejsie lub klasie kontraktu, która będzie w ramach jego wchodziła i którą klient będzie mógł wywoływać
- DataContract – atrybutem tym oznacza się typu (klasy, struktury, wyliczenia), które będą przesyłane przez sieć.
- DataMember – atrybutem tym oznacza się właściwości oraz pola klasy czy struktury, które mają być serializowane podczas przesyłania obiektów przez sieć.
Visual Studio bardzo pomaga tworzenie WCFowego serwisu. Wystarczy do projektu dodać WCF Service, a Visual Studio wygeneruje sam automatycznie szkielet pliku z interfejsem kontraktu, klasę implementująca dany serwis oraz odpowiednie wpisy w pliku Web.config.
Przykładowy kontrakt serwisu oznaczony powyższymi atrybutami może wyglądać tak:
1: [ServiceContract]
2: public interface ICustomerServices
3: {
4: [OperationContract]
5: Customer GetCustomer(int id);
6:
7: [OperationContract]
8: void DeleteCustomer(int id);
9: }
10:
11: [DataContract]
12: public class Customer
13: {
14: [DataMember]
15: public int Id { get; set;}
16:
17: [DataMember]
18: public string FirstName { get; set;}
19:
20: [DataMember]
21: public string LastName { get; set;}
22: }
Mając już zdefiniowany kontrakt wygenerowanym przez Visual Studio pliku *.svc implementujemy logikę serwisu.
Visual Studio automatycznie dodaj do Web.configa odpowiednie wpisy konfigurujące serwis (podstawową typową konfigurację). Wygląda ona następująco:
1: <system.serviceModel>
2: <services>
3: <service behaviorConfiguration="WcfService1.CustomerServicesBehavior"
4: name="WcfService1.CustomerServices">
5: <endpoint address="" binding="wsHttpBinding" contract="WcfService1.ICustomerServices">
6: <identity>
7: <dns value="localhost" />
8: </identity>
9: </endpoint>
10: <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
11: </service>
12: </services>
13: <behaviors>
14: <serviceBehaviors>
15: <behavior name="WcfService1.CustomerServicesBehavior">
16: <serviceMetadata httpGetEnabled="true" />
17: <serviceDebug includeExceptionDetailInFaults="false" />
18: </behavior>
19: </serviceBehaviors>
20: </behaviors>
21: </system.serviceModel>
Nie będę szczegółowo opisywał całej konfiguracji. Z ważniejszych rzeczy w niej są konfiguracji endpointów. Za ich pomocą definiuje się punkty dostępowe do serwisu. Jego adres, wykorzystywany binding itp.
Mając już stworzony serwis pozostaje tylko go wykorzystać. W tym celu trzeba wrzucić projekt na serwer i do innego projektu dodać referencje. Klikamy prawym na nazwę projektu i z menu wybieram Add Service Reference. W okienku, które się pojawi wpisuje adres serwisu, możemy sprawdzić sobie jakie kontrakty zawiera dany serwis oraz na koniec wygenerować klasy odpowiedzialne za komunikacje z serwisem. Okienko wygląda następująco:

Została wygenerowana klasa w tym przypadku CustomerServicesClient, za pomocą której możemy wywoływać metody serwisu, jak zwykłe metody:
1: CustomerServicesClient client = new CustomerServicesClient();
2: client.GetCustomer(20);
Co fajnie w WCFie jest to, że możemy korzystać z różnych sposób przesyłania informacji. Sam kod wykorzystujący serwis się nie zmienia, tylko wszystko jest ustawione w pliku konfiguracyjnym.
To byłoby by na tyle z podstaw Windows Communication Foundation. Jak ktoś jest bardziej zainteresowany tą technologią to polecam artykuły z serii przygotowującej do egzaminu z tej technologii.