Windows Communication Foundation (WCF) je jednou z noviniek, ktoré priniesol .NET Framework 3.0. WCF je jednotný framework na vytváranie servisne orientovaných aplikácii (SOA). So skratkou SOA sa v poslednej dobe stretávame v IT svete čoraz častejšie. Zrejme to bude spôsobené tým, že do tejto architektúry sa vkladajú veľké očakávania do budúcnosti.
reklama
Čo je WCF?
Windows Communication Foundation (WCF) je jednou z noviniek, ktoré priniesol .NET Framework 3.0. WCF je jednotný framework na vytváranie servisne orientovaných aplikácii (SOA). So skratkou SOA sa v poslednej dobe stretávame v IT svete čoraz častejšie. Zrejme to bude spôsobené tým, že do tejto architektúry sa vkladajú veľké očakávania do budúcnosti.
Prečo WCF?
Jednou zo silných stránok WCF je fakt, že zjednocuje Microsoft technológie používané pre distribuované aplikácie. Ak sme doteraz chceli vybudovať distribuovanú aplikáciu na technológiách od Microsoftu, mohli sme si vybrať z nasledovných technológii:
- ASP.NET Web Services (interoperabilita),
- Web Services Enhancements (WSE),
- .NET Remoting (výkonnosť),
- Enterprise Services (správa životného cyklu objektov, distribuované transakcie),
- Microsoft Message Queuing (MSMQ) – spoľahlivé doručovanie dát.
Výber konkrétnej technológie závisel na požiadavkách kladených na vytváranú aplikáciu. V súčasnom rôznorodom prostredí často krát vzniká situácia, že pre vytvorenie distribuovanej aplikácie treba použiť minimálne 2 zo spomínaných technológií. Časť systému mohla napríklad pre komunikáciu používať .NET Remoting (napr. keď sa kládol dôraz na výkonnosť aplikácie) a ďalšia časť Web Services (napr. komunikácia s nie .NET aplikáciami). Údržba a rozvoj takejto aplikácie bola potom náročná kvôli ťažko spravovateľnej komplexnosti. WCF zjednocuje vymenované technológie a vďaka tomu zjednodušuje vývoj, nasadenie a údržbu distribuovaných aplikácií.
Služby
Služby (services) sú základným stavebným prvkom aplikácií vo WCF. Službu chápeme ako systém s ktorým komunikujeme pomocou koncových bodov (endpointov). Koncový bod slúži na prijímanie správ a odosielanie odpovedí. Služba môže mať jeden alebo viac koncových bodov.
Myslím, že teórie bolo dosť a názornejšie bude ukázať možnosti WCF v akcii pomocou príkladu. Podrobnému výkladu základných pojmov WCF bude venovaná nasledovná časť seriálu.
Čo potrebujeme pre programovanie
Aby sme mohli programovať WCF aplikácie potrebujeme:
- .NET Framework 3.0
- Visual Studio 2005
- Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP
.NET Framework 3.0 je nutný, ostatné nám uľahčí prácu.
Príklad
Ako jednoduchú ukážku WCF som zvolil príklad služby, ktorá vráti zoznam kníh ktoré majú v názve zadané kľúčové slovo.
Pri programovaní WCF aplikácii vo Visual Studiu býva zvykom rozdeliť ju do viacerých projektov. Ja mám v jednom solution 3 projekty (zobrazuje to nasledujúci obrázok):

Servis
Projekt samotnej služby vytvoríme ako WCF Service Library:

Kód služby je:
using System;
using System.Collections.Generic;
using System.ServiceModel;
namespace LibraryService
{
[ServiceContract]
public interface ILibrary
{
[OperationContract]
string[] SearchBooksByTitle(string keyword);
}
public class Library : ILibrary
{
private static string[] books = {
"C# Cookbook [O'Reilly]",
"Pro C# 2005 and the .NET 2.0 Platform [Apress]",
"Understanding .NET [Addison Wesley Professional]",
"J2EE Design Patterns [O'Reilly]",
"JavaServer Faces in Action [Manning]",
"Java Persistence for Relational Databases [Apress]"
};
#region ILibrary Members
public string[] SearchBooksByTitle(string keyword)
{
Console.WriteLine("Received keyword: " + keyword);
List<string> result = new List<string>();
foreach (string book in books)
{
if (book.Contains(keyword))
result.Add(book);
}
return result.ToArray();
}
#endregion
}
}
Je to len obyčajná trieda implementujúca rozhranie. To čo z toho robí WCF službu sú len dva atribúty a to:
[ServiceContract] aplikovaný na rozhranie ILibrary
[OperationContract] aplikovaný na metódu SearchBooksByTitle
Neznámy môže byť taktiež menný priestor System.ServiceModel, pretože je to nový menný priestor, ktorý prišiel s WCF.
Host
Služba je hostovaná v konzolovej aplikácii. Do projektu treba pridať referenciu na assembly System.ServiceModel.dll. Zdrojový kód aplikácie na hostovanie služby je:
using System;
using System.ServiceModel;
namespace Host
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8080/library");
Type serviceType = typeof(LibraryService.Library);
using (ServiceHost host = new ServiceHost(serviceType, baseAddress))
{
host.Open();
Console.WriteLine("Service started at address: " + baseAddress);
Console.ReadLine();
host.Close();
}
}
}
}
V tomto projekte je dôležitý ešte súbor App.config, ktorý obsahuje konfiguráciu služby:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="LibraryService.Library" behaviorConfiguration="metadataSupport">
<endpoint binding="basicHttpBinding" contract="LibraryService.ILibrary" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Okrem samotnej konfigurácie endpointu služby za pozornosť stojí aj element behavior, v ktorom je nastavená publikácia metadát služby. Toto musíme nastaviť explicitne, pretože z bezpečnostných dôvodov nie je publikácia metadát služby povolená (implicitné nastavenie).
Klient
Poslednou časťou solution je projekt klienta, ktorý komunikuje so službou. Opäť je to konzolová aplikácia. Najdôležitejším krokom pri vytváraní klienta je vygenerovanie proxy triedy prostredníctvom ktorej budeme komunikovať so službou. Spustíme najskôr službu spustením hostovacej konzolovej aplikácie. Potom klikneme na projekt klienta pravým tlačítkom a vyberieme Add Service Reference:

V zobrazenom dialógovom okne napíšeme adresu služby a názov referencie služby:

Vygenerovaná proxy trieda má názov LibraryClient a kód celého klienta potom bude:
using System;
using Client.Library;
namespace Client
{
class Program
{
static void Main(string[] args)
{
using (LibraryClient libraryClient = new LibraryClient())
{
Console.Write("Enter keyword: ");
string keyword = Console.ReadLine();
string[] result = libraryClient.SearchBooksByTitle(keyword);
libraryClient.Close();
PrintResult(result);
Console.ReadLine();
}
}
private static void PrintResult(string[] result)
{
Console.WriteLine("\nResult:");
foreach (string book in result)
{
Console.WriteLine(book);
}
}
}
}
Opäť aj klienta treba nakonfigurovať pomocou súboru App.config, aby vedel komunikovať so službou:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint
address="http://localhost:8080/library"
binding="basicHttpBinding"
contract="Client.Library.ILibrary" />
</client>
</system.serviceModel>
</configuration>
Po spustení služby spustíme klienta, zadáme nejaký reťazec a vidíme výsledok, ktorý vrátila služba. Zdrojový kód celého príkladu si môžete stiahnúť tu.
Ing. Marián Košťál (csharp@azet.sk)