WCF teenused - teeme otsad lahti
07.07.2007 | GunnarSeoses WCF teenuste katsetamisega oli mul vaja teenused arendustööde arvutis käima saada IIS-i all. Vaikimisi Visual Studio poolt loodav WCF teenuste teek IIS-i tuge endas automaatselt ei sisalda. Tekkis veel pisikesi tõrkeid, mille suutsin kõigest hoolimata siiski kenasti ületada.
Server
Alustuseks tegin lihtsa teenuse, mis liidab kaks arvu kokku. Milline klassika, eks ole.
Teenuse loomisel valisin projekti tüübiks WCF Service Library. Teenuse fail, millel nimeks MathService.cs, näeb välja selline.
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
namespace WCFTest
{
[ServiceContract()]
public interface IMathService
{
[OperationContract]
double Add(double x, double y);
}
public class MathService : IMathService
{
public double Add(double x, double y)
{
return x + y;
}
}
}
Järgmiseks küsimuseks sai IIS. Projekti kataloogi mappimine IIS-i alla osutus suhteliselt mõttetuks, sest IIS-i all otsitakse aplikatsiooni binary faile kataloogist /bin, kuid kompileerimisel tekivad failid kataloogi /bin/Debug. Lahendusena kirjutasin WCF-teenuse projektile post-build käsud, mis kopeerivad kõik vajaminevad failid IIS-i kataloogidesse nagu peab. IIS-i kataloog tuleb muidugi teha IIS-i aplikatsiooniks.
Järgmiseks panin paika teenuse konfi.
<configuration>
<system .web>
<compilation debug="false"/>
<authentication mode="Windows"/>
</system>
<system .serviceModel>
<services>
<service name="WCFTest.MathService"
behaviorConfiguration="MathServiceBehavior">
<endpoint address=""
binding="basicHttpBinding"
contract="WCFTest.IMathService" />
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex" />
</service>
</services>
<behaviors>
<servicebehaviors>
<behavior name="MathServiceBehavior">
<servicedebug includeExceptionDetailInFaults="False" />
<servicemetadata httpGetEnabled="true" />
</behavior>
</servicebehaviors>
</behaviors>
</system>
</configuration>
Ja nüüd siis kõige põnevad osa - kuidas teha teenus IIS-i all nähtavaks. Selleks pole vaja rohkemat kui luua teenuse nimega fail, millel on svc laiend. Minu puhul siis MathService.svc. Faili sisu on lihtne - seal pannakse paika teenuse klassi nimi.
Sellega peaks olema nüüd teenuse osa püsti. Selles on küllaltki lihtne veenduda - tuleb vaid teenus ära kompileerida ning sisestada brauserisse teenuse URL. Kui midagi on valesti, siis saame vea. Kui kõik on okay, siis näeme teenust tutvustavat lehte, mille ülemises osas on teenuse WSDL-i URL.

Klient
Teenuse testimiseks tegin lihtsa klientprogrammi, mis liidab kaks arvu ning näitab tulemust ekraanil.
using System.Collections.Generic;
using System.Text;
using WCFTestConsole.MathService;
namespace WCFTestConsole
{
class Program
{
static void Main(string[] args)
{
MathServiceClient client = new MathServiceClient();
Console.WriteLine("2 + 3 = " + client.Add(2, 3));
Console.WriteLine("Press any key to exit");
Console.ReadLine();
}
}
}
Siinkohal avastasin midagi uut ja huvitavat - nimelt teenuse külge haakimine veebiteenusena käitub erinevalt sellest, kui haakida teenus külge WCF teenusena. SOAP-i korral luuakse hoopis teistsugused wrapper meetodid. Neil on argumente kaks korda sama palju kui teenuse meetodil pluss kaks lisaargumenti tagastatud tulemuse jaoks. Iga argumendi ja tagastatud tulemusel on juures boolean tüüpi lisaparameeter, mis ütleb, kas antud parameeter on määratud või ei.
Kui teenus võtta külge sel teel, et lisada projekti viide teenusele, siis neid parameetreid ei teki, sest WCF-i klient suudab ise korrektselt tekkinud olukorra ära lahendada.
Põhjalikumat lugemist pakub sellel teemal Eugene Osovetsky blogi kanne Solving the "disappearing data" issue when using Add Web Reference or Wsdl.exe with WCF services.
Nüüd on WCF-iga alustamiseks ning tulemuste testimiseks kõik vajalik olemas ja seega jääb veel üle vaid soovida edukat WCF-i kasutamist.
