11

WCF pro začátečníky – 3. díl: vytvoření služby, hostovací a klientské aplikace

autor Kryštof Laryš | publikováno 24. února 2009


V tomto díle se podíváme na to, jak vytvořit jednoduchou WCF službu, dále aplikaci, která bude službu hostovat neboli hosta a klientskou aplikaci neboli klienta. Pokusíme se využít a názorně si ukázat použití většiny pojmů definovaných v minulém díle.

K tomuto dílu seriálu jsem vytvořil i video návody. Text seriálu slouží primárně k vysvětlení daného problému, video návody k jeho praktické ukázce, neboli jak přesně udělat to, co je zde napsáno. Na konci tohoto dílu najdete i všechny zdrojové kódy ke stažení.

Vytvoření služby
Visual Studio 2008 s .NET Frameworkem 3.5 nám nabízí dva základní typy WCF služby, které můžeme vytvořit. Rozdíl mezi nimi je hlavně v možnosti způsobu hostování služby. My si zkusíme oba dva tyto způsoby. První z nich je template WCF Service Application, který najdeme v záložce Web při vytváření nového projektu a druhý template je WCF Service Library v záložce WCF.

Vytvoření služby – WCF Service Application
Tuto WCF službu si vytvoříme, pokud předem víme, že ji budeme hostovat v IIS. Pozor, IIS není standardně nainstalována ve Windows XP ani Windows Vista.

Jak IIS nainstalovat ve Windows XP?
Start -> Nastavení -> Ovládací panely -> Přidat nebo odebrat programy -> Přidat nebo odebrat součásti systému -> Internetová informační služba -> Další -> Dokončit

Jak IIS nainstalovat ve Windows Vista?
Start -> Ovládací panely -> Programy -> Zapnout nebo vypnout funkce systému Windows -> Internetová informační služba -> OK

Vytvoříme tedy WCF Service Application s názvem IISHost. V nově vzniklém projektu vidíme tři základní soubory. IService1.cs, který obsahuje interface služby a všechny kontrakty, které bude služba publikovat. Konkrétně to jsou ServiceContract a DataContract. V souboru Service1.svc je “podsoubor“ Service1.svc.cs, který obsahuje třídu implementující rozhraní IService1. Třetím důležitým souborem je Web.config, který obsahuje veškerou konfiguraci naší právě vytvořené WCF služby. Konfiguraci můžeme jednoduše měnit v zabudovaném editoru, když na soubor Web.config klikneme pravým tlačítkem myši, a pak na Edit WCF Configuration. Pokud se náhodou stane, že by se položka Edit WCF Configuration v kontextovém menu nenacházela, jde o bug, který Microsoft vyřešil následujícím elegantním způsobem. Klikněte v hlavním menu na záložku Tools a WCF Service Configuration Editor. Otevře se vám prázdný editor, který můžete klidně hned zavřít. Nyní zkuste znovu kliknout pravým tlačítkem myši na soubor Web.config a položka Edit WCF Configuration už by tam měla být.

V tomto bodě i bez zásahu do samotného kódu máme již základní službu vytvořenou. Defaultně je nastaven wsHttpBinding pro komunikaci s klienty a mexHttpBinding pro publikování metadat. Všemožné nastavení můžeme prozkoumat ve WCF Configuration Editoru, ale věnovat se mu budeme později. Aplikaci spustíme bez debugování. Vytvoří se instance ASP.NET Developement Serveru, která simuluje spouštění služby na localhostu a otevře se prohlížeč s oknem, kde uvidíme stejné soubory jako ve Visual Studiu. To znamená, že nám služba již běží a pokud se klient připojí na adresu, na které je služba, může s ní začít pracovat. Tímto způsobem můžeme službu zkoušet a ladit. Jak ji spustit v IIS? Otevřeme si nastavení projektu, vybereme záložku Web a klikneme na radiobutton Use Local IIS Web server. Doplní se nám adresa se službou. Klikneme na vytvoření virtuálního adresáře a služba se nám vloží do IIS. Zjistit, jestli služba funguje, je snadné. Stačí do prohlížeče napsat adresu, kde je služba hostována (stejná adresa, kterou nám doplnila konfigurace) a za to dopsat ještě soubor Service1.svc. Pokud zůstaneme u defaultního templatu a našeho pojmenování, bude adresa vypadat takto: http://localhost/IISHost/Service1.svc
Jestli služba opravdu jede, objeví se nám na stránce text: „Vytvořili jste službu.“ atd. Pokud nevypnete IIS, poběží vám služba pokaždé, když budete mít zapnutý počítač. Ke správě IIS a podrobnějšímu nastavení se dostanete přes správu počítače nebo přímým spuštěním systémového souboru inetmgr.

Vytvoření služby – WCF Service Library

V čem je rozdíl mezi WCF Service Application a WCF Service Library? Jak jsem již zmínil, hlavní rozdíl je ve způsobu hostování, kdy WCF Service Application určitě nebudeme hostovat například v konzolové aplikaci, jelikož to není možné. WCF Service Library je doslova dynamická knihovna, kterou musíme někde v nějaké aplikaci nahrát a pracovat s ní. Je to klasický soubor s dll příponou. Service Library budeme hostovat v konzolové aplikaci, kde si i ukážeme, jak službu nastavovat a popíšeme si podrobněji způsob její implementace. Tato služba se dá ale hostovat například i ve Windows procesu, Windows Forms aplikaci, WPF aplikaci a dalších, ale pro naše účely to není podstatné, protože z hlediska konfigurace a programování samotné WCF služby to nemá vliv. WCF Service Library vytvoříme kliknutím na template projektu v záložce WCF. Po vytvoření vidíme opět tři důležité soubory. IService1.cs a Service1.cs mají stejnou funkci a zhruba stejný kód jako ve WCF Service Application. Konfigurační soubor se ovšem jmenuje App.config a v defaultní podobě má daleko méně řádků než Web.config. Do našeho solution si přidáme prázdnou konzolovou aplikaci ze záložky Windows a pojmenujeme ji Host. Nyní musíme přidat knihovnu služby pomocí Add Reference. Najdeme naší WCF Service Library a přidáme do projektu. Pomocí Add Service Reference přidáme referenci na tu stejnou službu. Ovšem teď už nepřidáváme knihovnu dll, ale říkáme hostovací aplikaci, kde se služba nachází a jaké poskytuje metody. To provedeme kliknutím na tlačítko Discover a OK. Do konzolové aplikace přidáme tyto tři řádky, abychom mohli pracovat se službou

 

				using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using WcfServiceLibrary1;

a do těla hlavní metody toto:

 

				using (var host = new ServiceHost(typeof(Service1)))
{
       host.Open();
       Console.WriteLine("Service started.\n\nType \"exit\" to terminate the service.\n");
            for (int i = 0; i < host.ChannelDispatchers.Count; i++)
            {
                var channelDispatcher = host.ChannelDispatchers[i] as ChannelDispatcher;
                if (channelDispatcher != null)
                {
                    for (int j = 0; j < channelDispatcher.Endpoints.Count; j++)
                    {
                     EndpointDispatcher endpointDispatcher = channelDispatcher.Endpoints[j];
                     Console.WriteLine("Listening on " + endpointDispatcher.EndpointAddress + "\n");
                     }
                }
            }
       Console.ReadLine();
       host.Close();
}

Nesmíme zapomenout na zkopírování obsahu souboru App.config z projektu WCF Service Library do souboru App.config hostovací konzolové aplikace. Musíme to udělat proto, že automaticky vygenerovaný konfigurační soubor v konzolové aplikaci je připravený pro spuštění klientské aplikace, ne hostovací. Po spuštění se nám pustí WCF služba hostovaná v této aplikaci. Je přístupná na adrese, kterou vidíme v okně aplikace. Otestovat si ji můžeme stejným způsobem, jakým jsme testovali správné spuštění WCF služby hostované v IIS.

Nastavení služby – service behavior

Nyní si ukážeme, jak využít pojmy, které jsme si vysvětlili v minulém díle. K tomu nám dobře poslouží již zmíněná konfigurační utilitka WCF Service Configuration Editor. Časem však zjistíme, že vůbec není složité psaní konfigurace ručně do konfiguračních souborů. V projektu WCF Service Library, který už máme vytvořený, si otevřeme editor konfigurace.
Jako první věc si nastavíme jiný binding. U prvního endpointu klikneme na “(Empty Name)“ a v části Endpoint Properties vybereme například netTcpBinding. U endpointu s bindingem netTcpBinding klikneme na “Default (Click to Create)“. Objeví se nám stránka s podrobným nastavením bindingu. Konfiguraci si můžeme celou pročíst. Názvy vlastností jsou pochopitelné a většinou velmi dobře vypovídají o tom, co budeme nastavovat. Jakmile máme nastavení hotovo, musíme jej ještě přidružit k danému endpointu. Ten si opět vybereme a v BindingConfiguration přidělíme vytvořenou konfiguraci.
Zkusíme si nastavit ještě throttling. Rozklikneme si záložku Advanced a Service Behaviors. Klikneme na již vytvořený behavior a pomocí Add přidáme serviceThrottling. Ten se nám nyní objeví v nastavení behavior. Zde si již můžeme upravit vlastnosti, které jsme se naučili minule.
U všech těchto nastavení doporučuji zkoušet a procházet si konfigurátor, ať se dozvíte, co všechno a kde se dá nastavit. Nemáte co zkazit, vždy můžete začít znovu.
Musíme ale ještě myslet na to, že když jsme změnili protokol HTTP na TCP, musíme změnit i adresu, na které služba poběží, protože toto nám konfigurátor sám neupraví. V záložce Services vybereme Host a změníme BaseAddress tlačítkem Edit na net.tcp://localhost:9000/test
Stále nejsme hotovi, protože potřebujeme nastavit i jiný binding u publikování metadat. V našem případě jde o druhý endpoint, který máme v editoru přístupný. Místo mexHttpBinding vybereme mexTcpBinding a v části Advanced, Service Behaviors vybereme serviceMetadata a HttpGetEnabled nastavíme na false, protože už nemáme žádnou adresu, která by byla přístupná přes protokol HTTP.
Editor zavřeme a potvrdíme změny. Když se podíváme do souboru App.config, vidíme změny, které jsme provedli. Nesmíme zapomenout přepsat soubor App.config v hostovací aplikaci našim novým souborem z WCF Service Library, jinak by se neprojevily změny. Provedeme rebuild solution a můžeme spustit hostovací aplikaci. V okně aplikace vidíme, že služba běží na protokolu TCP.

Zkusíme si nastavit ještě instancing, concurrency a sessions, které se konfigurují přímo v kódu WCF služby. Otevřeme si tedy soubor IService1.cs a řádek se [ServiceContract] přepíšeme tímto:
 

				[ServiceContract(SessionMode = SessionMode.Allowed)]

Co jsme teď udělali je pouze to, že jsme použili hodnotu u SessionMode, která je defaultně nastavená na Allowed. Dále si nastavíme instance mód na PerCall a Concurrency mód na Single přidáním tohoto kódu před název třídy:

 

				[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
                 ConcurrencyMode = ConcurrencyMode.Single)]
    public class Service1 : IService1

Ještě malá poznámka. Defaultně mají všechny protokoly nastaveny InstanceContextMode na PerSession. Pokud by se ale stalo, že bychom použili protokol, který PerSession nepodporuje, automaticky se použije mód PerCall. To je případ u bindingu basicHttpBinding.

Vytvoření klienta

Do této chvíle jsme se naučili, jak vytvořit službu a kde a jak ji hostovat. V poslední části tohoto dílu si řekneme, jak se ke službě připojíme a jak můžeme volat její metody.

Klient může být opět libovolná aplikace. Nemusí to být ani aplikace napsaná v .NETu. Pro naše účely si opět vystačíme s jednoduchou konzolovou aplikací. V již existujícím solution, se kterým jsme doposud pracovali, si vytvoříme projekt konzolové aplikace a pojmenujeme jej Klient. Stejně jako jsme to udělali v hostovací aplikaci, i tady si přidáme Service Referrence na naši WCF Service Library. Pozor, ta už je teď na druhém místě a poznáme ji podle názvu test/mex a použitého protokolu TCP. Vygenerují se nám nutné reference a konfigurační soubor App.config, který už nemusíme nijak přizpůsobovat. Do hlavní spouštěcí metody klientské aplikace vložíme tento kód:
 

				using (var proxy = new Service1Client())
            {
                proxy.Open();
                Console.Write("Write some number: ");
                string value = Console.ReadLine();
                try
                {
                    if (value != null) Console.WriteLine(proxy.GetData(int.Parse(value)));
                }
                catch(Exception e)
                {
                    Console.WriteLine("\nChyba:\n{0}\n", e.Message);
                }
                proxy.Close();
            }

A nesmíme zapomenout přidat i
 

				using Klient.ServiceReference1;

V podstatě se zde neděje nic jiného, než že se vytvoří proxy třída (zmiňoval jsem se v minulých dílech) a pomocí ní voláme metodu GetData, kterou publikuje služba. Pokud si chcete vyzkoušet funkčnost aplikace, spusťte nejprve službu s názvem Host a následně klienta s názvem Klient.


Zdrojový kód k dnešnímu dílu.

Video návod k vytvoření služby hostované v IIS.

Video návod k vytvoření služby hostované v konzolové aplikaci a vytvoření klienta.


Protože toho bylo v tomto díle celkem dost, díl následující bude poněkud kratší a bude o tom, jak hostovat WCF službu ve Windows Service.


Kryštof