Wstęp
Windows Communication Foundation (nazwa kodowa Indigo) to następna generacja usług sieciowych. Jest częścią nowego Framework 3.0. Windows Communication Foundation jest warstwą komunikacyjną API WinFX i jest dostępna dla Microsoft Windows XP, 2003 i Visty. Windows Vista zawiera w sobie już .NET Framework 3.0. Dla Windows XP/2000, Windows Server 2003 dodatek ten jest dostępny do ściągnięcia na stronach Microsoft. Aby korzystać z tego rozwiązania trzeba jeszcze zainstalować rozszerzenie do Microsoft Visual Studio 2005.
Windows Communication Foundation łączy wszystkie dotychczasowe technologie Microsoftu służące do komunikacji: XML Web Services, .NET Remoting, COM, COM+ oraz MSMQ. WCF scala wymienione wyżej rozwiązania i oferuje ujednolicony model dla aplikacji sieciowych. Do komunikacji na jednej maszynie można wykorzystać potoki. Praktycznie niezależnie od protokołu komunikacji (HTTP, TCP, komunikacja międzyprocesowa) czy zastosowanej technologii, sposób budowy usługi jest ten sam. Jednocześnie nowe rozwiązanie łatwo integruje się z podstawowymi webserwisami ASMX i COM+. WCF do komunikacji wykorzystuje SOAP, co decyduje o jej uniwersalności i łatwym łączeniu z innymi systemami operacyjnymi czy technologiami.
WCF zostało zaprojektowane z myślą o obsłudze połączeń pomiędzy aplikacjami za pomocą sieci. Klienci mogą połączyć się z wieloma usługami, usługi natomiast z wieloma klientami. Wątki te przeważnie posiadają Web Services Description Language(WSDL), czyli interfejs który każdy klient wykorzystuje do połączenia. Jednocześnie nieistotnie jest z jakiej platformy dana usługa się łączy.
Architektura Windows Communication Foundation
Główne komponenty WCF
Aplikacja WCF zawiera cztery elementy:
- Contract definitions - Usługa musi zawierać co najmniej jeden service contract, może również posiadać wiele service contracts, data contracts, albo message contracts;
- Endpoint definitions - Jeden albo więcej adress-binding-contract endpoints musi zostać zdefiniowany;
- Hosting code - Kod potrzebny do uruchomienia usługi sieciowej;
- Implementation code - Implementacja programu.
Contracts
Contracts jest to zbiór operacji, które określają w jaki sposób Endpoint łączy się z aplikacją. Każda operacja jest to prosty system wymiany wiadomości. Klasa ContractDescription jest używana do określenia WCF Contracts, jak również operacji. Wraz ContractDescription każdy Contract ma odpowiedni OperationDescription który opisuje aspekty operacji np. one-way albo request/reply. Każdy OperationDescription określa wiadomość, która tworzy operacje wykorzystując MessageDescriptions. ContractDescription jest tworzone na podstawie interfejsu albo klasy, która definiuje Contract przy użyciu modelu WCF.
Windows Communication Foundation zawiera cztery rodzaje contracts:
- Service contract - opisuje metody, które może wykonać usługa,
- Data contract - określa strukturę danych. Data contract jest zdefiniowana z atrybutami [DataContract] oraz [DataMember],
- Message contract – definiuje, jak ma wyglądać wiadomość. [MessageContract], [MessageBodyMember], oraz [MessageHeader],
- Fault contract - pozwala dokumentować błędy, które powstały w kodzie.
Service Contracts
Service Contracts opisuje operacje, jakie usługa może wykonać. Łączy interfejs oraz metody usługi niezależnie od platformy.
Definiujemy service contract jako opis interfejsu (albo klasy) atrybutem [ServiceContract]. Określamy operację naszej usługi zamieszczając [OperationContract] naszej metody. Przykład poniżej to ilustruje:
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string HelloWorld (string txt);
}
Jeżeli już zdefiniowaliśmy service contract przy użyciu interfejsu możemy teraz napisać klasę, która wykorzysta interfejs:
public class HelloWorldService : IHelloWorldService
{
public string HelloWorld(string txt)
{
return "Witamy " + txt;
}
}
Endpoints
Usługa ukazuje conajmniej jeden endpoints, gdzie instrukcje będą przesyłane. Każdy Endpoint zawiera: address, binding, oraz contract.
- Address określa, gdzie mają być wysyłane instrukcje wiadomości.
- Binding opisuje, jak mają być wysłane wiadomości.
- Contract zawiera informacje na temat wiadomości.
Klienci muszą znać te informacje zanim się połączą z usługą. Endpoint zawiera adres URL, określający gdzie można się połączyć.
Bindings
Bindings w usłudze WCF - definiuje ją Endpoint, który będzie się łączyć z klientem. Charakterystyka Bindings:
- Protokoły sieciowe - mamy do wyboru HTTP, TCP oraz MSMQ
- Szyfrowanie - trzy typy szyfrowania.
- Bezpieczeństwo - zawiera SSL oraz WS-Security
Tabelka przedstawia listę WCF wbudowanych bindings oraz ich opisy:
Binding | Opis |
---|---|
BasicHttpBinding | Podstawowa usługa web, bez zabezpieczeń. |
WSHttpBinding | Usługa Web z wsparciem WS-*. |
WSDualHttpBinding | Usługa Web z duplex contract oraz ze wsparciem transakcji. |
WSFederationHttpBinding | Usługa Web z wykorzystanie zabezpieczeń federalnych. Wsparcie transakcji. |
MsmqIntegrationBinding | Połączenie bezpośrednio z aplikacja MSMQ. Wsparcie transakcji. |
NetMsmqBinding | Połączenie pomiędzy aplikacjami WCF przy wykorzystaniu kolejki. Wsparcie transakcji. |
NetNamedPipeBinding | Połączenie pomiędzy aplikacjami WCF na tym samy komputerze. Wsparcie duplex contracts oraz transakcje. |
NetPeerTcpBinding | Połączenie pomiędzy komputerami usługa peer-to-peer. Wsparcie duplex contracts. |
NetTcpBinding | Połączenie pomiędzy aplikacjami WCF. Wsparcie duplex contracts oraz transakcje. |
Przykładowy kod implementacji usługi w C#
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
namespace HelloService
{
class Program
{
static void Main(string[] args)
{
Uri baseURI = new Uri(http://localhost/hello);
ServiceHost HService = new ServiceHost(typeof(HelloService), baseURI);
HService.AddServiceEndpoint(typeof(HelloService), new BasicHttpBinding(),baseURI);
HService.Open();
Console.WriteLine("Usługa jest gotowa.");
Console.ReadKey();
HService.Close();
}
}
[ServiceContract]
class HelloService
{
[OperationContract]
string sayHi()
{
return ("Hi!");
}
}
}
Przykładowy kod implementacji klienta w C#
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
namespace HelloClient
{
class Program
{
static void Main(string[] args)
{
HelloServiceProxy p = new HelloServiceProxy();
Console.WriteLine(p.sayHi());
}
}
}
Podsumowanie
Windows Communication Foundation to nowoczesna technologia do budowania aplikacji sieciowych, która znacznie ułatwia implementację programów. Zalety:
- Wspólne API,
- Dowolne medium (HTTP/TCP/IPC/MSMQ),
- Bezpieczeństwo,
- Transakcje.
Zaletą Windows Communication Foundation jest to, że można implementować go nie tylko w jednym języku (można wykorzystać C# albo Visual Basic). Możliwości Windows Communication Foundation są bardzo duże. Zapraszam do sukcesywnego pogłębiania wiedzy na ten temat.