Software

Webtjenester med .NETalternativet Mono

Hvad er webtjenester i relation til udviklingsplatformen Mono? Hvad går Mono-projektet ud på, og hvordan blev webtjenester en del af udviklingsplatformen?

"I har hørt, at der er sagt: Øje for øje og tand for tand. Men jeg siger jer, at I ikke må sætte jer til modværge mod den, der vil jer noget ondt. Men slår nogen dig på din højre kind, så vend også den anden til". Matthæusevangeliet 5:38-39

Mono-projektet
Mono er kort sagt en åben kildeteks implementation af Microsoft (MS) .NET. Dette udsagn skal dog tages med et gran salt, for selvom begge platforme har det til fælles, at de er baserede på Common Language Infrastructure (CLI) og programmeringssproget C#, er de ret forskellige. Eksempelvis benytter de to diametralt modsatte udviklingsmetoder. Mono udvikles efter fri software-principperne mens .NET udvikles efter den lukkede model. MS .NET er målrettet til Microsofts styresystemer (Windows), mens Mono-projektet går efter at køre på så mange platforme som muligt (Mac OS X, Linux, Windows m.fl.).

Med ovenstående i mente vil en bedre beskrivelse af Mono være "En omfattende udviklingsplatform baseret på åben kildetekst".
Se resurserne [2] og [3] for en generel gennemgang af Mono.

Webtjenester
Webtjenester bruges af programmer til at kommunikere med hinanden. Disse tjenester fungere på tværs af platforme i et heterogent computermiljø. Dette lader sig gøre, fordi webtjenester baserer sig på webstandarder som HTTP, XML+NS, XSD og SOAP.

Et program kan eksempelvis implementere søgning på www vha. en webtjeneste fra Google.

Ganske enkelt fungerer webtjenester ved at sende XML-formaterede beskeder over et netværk. En slags moderne RPC via www.

Mono implementerer MS .NET Web Services. Endvidere er det muligt at bruge andre webtjeneste-teknologier, eksempelvis XmlRpcCS.

Lidt historisk baggrund
It-virksomheden SourceGear fører produktet "Vault", hvilket kan sammenlignes med MS SourceSafe. Vault-klienten var oprindelig skrevet til MS Windows og .NET, men er i dag også tilgængelig på Linux vha. Mono-platformen.

SourceGear ville gerne tilbyde deres kunder muligheden for at benytte Vault fra Linux af. Derfor indgik de i et udviklingspartnerskab [4] med Ximian, nu Novell Ximian Services (NXS), med det formål at forbedre Mono således, at Vault-klienten kunne benyttes på Linux.

Tim Coleman [5] havde begyndt arbejdet med implementeringen af webtjenester i Mono, men var ikke nået særligt langt. Det var først igennem partnerskabet med SourceGear, at webtjenester blev en realitet i Mono.

Der blev bl.a. implementeret en helt ny XML-serializer (grundlaget for webtjenester) og et nyt design og implementering af HTTP-klientkoden.
Partnerskabet førte endvidere en masse sidegevinster med sig, Mono blev testet, fejlrettet og optimeret som aldrig før.

Installation af Mono
Alt afhængig af hvilket styresystem du benytter dig af, er der flere muligheder for at installere Mono. De fleste Linux-distributioner tilbyder muligheden for at installere Mono vha. deres pakkesystem. Endvidere er installationspakker tilgængelige på Mono-projektets hjemmeside til de mest udbredte styresystemer, Linux, Mac OS X og Windows.

I den følgende demonstration af webtjenester benytter jeg mig af Ubuntu Linux [6] version 5.10 og Mono fra dennes pakkesystem.

Stavekontrol med Google
Google tilbyder et pænt udvalg af webtjenester [7], som man nemt kan benytte sig af programmatisk i sine egne programmer. Når man fx indtaster "housee" i Google's søgefelt, foreslår google "house". Denne stavekontrol er også tilgængelig som en webtjeneste. Nedenstående eksempel viser, hvordan man konsumerer denne webtjeneste med Mono.

Google beskriver deres webtjenester i XML-formatet Web Service Description Language (WSDL). Med denne og Mono's værktøj wsdl kan man generere en kodestub til at benytte deres webtjeneste.

Først genereres kodestuben fra kommandolinjen.

wsdl api.google.com/GoogleSearch.wsdl



Dernæst oversættes den til et programmeringsbibliotek.
mcs GoogleSearchService.cs -t:library -r:System.Web.Services

Hvilket resulterer i filen GoogleSearchService.dll.

Parametrene -t og -r angiver henholdsvis at kildeteksten skal oversættes til et bibliotek, og at navneområdet System.Web.Services benyttes af GoogleSearchService.

Man kan undersøge hvilke muligheder biblioteket tilbyder på flere måder eksempelvis ved at læse kildeteksten eller benytte programmet monop. Monop udskriver simpelthen bibliotekets programmeringsgrænseflade (metoder og egenskaber). Prøv:
monop -r:GoogleSearchService.dll GoogleSearchService

I dette eksempel benyttes metoden doSpellingSuggestion, der har følgende signatur:
public string doSpellingSuggestion (string key, string phrase);

Umiddelbart ser metoden simpel ud. Den kaldes med den sætning, der skal stavekontrolleres, og der returneres et forslag. Men hvad indebærer den formelle parameter "key"?

Google har en hjemmeside for deres webtjenester [7]. Her beskrives webtjenesternes grænseflader [7]. Under henvisningerne Reference -> Spelling Requests er der en generel beskrivelse af metoden, dens opførsel og begrænsninger.

Under overskriften Search Request Format beskrives parameteren key. Parameteren bruges af Google til at godkende og logge brugen af deres webtjenester. En sådan skal altså rekvireres [8].

Nedenstående eksempel skrevet til Mono i C# og Gtk# benytter sig af denne webtjeneste.

grafik

Programmet oversættes med Mono C#-oversætteren:
mcs -r:GoogleSearchService -pkg:gtk-sharp-2.0 Stavekontrol.cs

Flaget -r angiver, at programmet benytter sig af biblioteket GoogleSearchService, mens -pkg angiver alle de biblioteker, som gtk-sharp-2.0 afhænger af.

Skærmbillede 1 og 2 viser programmet i funktion henholdsvis før og efter et opslag.

grafik

grafik

Programmér din egen webtjeneste
Udover at konsumere webtjenester kan man udvikle sine egne webtjenester med Mono og gøre dem tilgængelige på nettet.

Mono benytter sig af ASP.NET til at afvikle webtjenester. Uden at gå for meget i detaljer er ASP.NET den del af Mono, som giver mulighed for at programmere dynamiske hjemmesider. Denne del af Mono består af XSP, som både er vært for ASP.NET og samtidigt en lille webserver. Desuden findes der et Apachemodul kaldet mod_mono, der gør det muligt at benytte XSP sammen med webserveren Apache.

Nedenstående er et simpelt eksempel på en webtjeneste, der omregner mellem celsius og fahrenheit.

grafik

For at afvikle webtjenesten behøver man blot at starte programmet xsp og åbne adressen 127.0.0.1/Temperatur.asmx i en browser.



XSP genererer en oversigtsside for webtjenesten, hvor man bl.a. kan teste de to metoder. For at benytte tjenesten programmatisk kan man få genereret en kodestub (Client proxy) direkte på siden, eller man kan benytte sig af værktøjet wsdl og henvisningen Service Description.
Se skærmbillede 3.

grafik

Afrunding
Ovenstående var en kort introduktion til webtjenester på Mono-platformen med et par simple eksempler. For en mere dybdegående gennemgang af webtjenester og Mono kan jeg anbefale at læse .NET Web Services:

Architecture and Implementation af Keith Ballinger og kapitlet omhandlende webtjenester i Monohåndbogen [9].

En af de mest modne og gennemtestede dele af Mono-platformen er ASP.NET og webtjenester. Jeg kan klart anbefale at benytte disse både til undervisningsformål men også i produktionssystemer.

"I har hørt, at der er sagt: Du skal elske din næste og hade din fjende. Men jeg siger jer: Elsk jeres fjender og bed for dem, der forfølger jer," Matthæusevangeliet 5:43-44

Læs også tidligere artikel om Mono i PROSIT NOV 04:

www.prosa.dk/stud/visprosit.php



Resurser
[1] Mono-projektet
www.mono-project.com
[2] .NET-alternativet Mono
PROSIT nov. 2004
[3] Mono en udviklingsplatform baseret på åben kildetekst
mwh.sysrq.dk/presentations/mono-20051115/mono_en_oss-platform.html.
[4] Udviklingspartnerskabet
www.novell.com/news/press/archive/2003/ximian_archive/pr060203.html
[5] Tim Coleman
www.mono-project.com/Hall#Tim_Coleman
[6] Ubuntu Linux
www.ubuntu.com
[7] Google's webtjenester
www.google.com/apis/
[8] Rekvirer en Google nøgle
api.google.com/createkey.
[9] Monohåndbogen
www.mono-project.com/Web_Services.