Microsoft.NET Framework 3.0

Maat: px
Weergave met pagina beginnen:

Download "Microsoft.NET Framework 3.0"

Transcriptie

1 Academiejaar Departement Toegepaste Ingenieurswetenschappen Schoonmeersstraat Gent Microsoft.NET Framework 3.0 Eindwerk voorgedragen tot het behalen van het diploma van INDUSTRIEEL INGENIEUR INFORMATICA Tom DESCHEPPER Fréderic SPILEERS Promotoren: Leen BROUNS Danny CHRISTIAENS (Dolmen)

2

3 Academiejaar Departement Toegepaste Ingenieurswetenschappen Schoonmeersstraat Gent Microsoft.NET Framework 3.0 Eindwerk voorgedragen tot het behalen van het diploma van INDUSTRIEEL INGENIEUR INFORMATICA Tom DESCHEPPER Fréderic SPILEERS Promotoren: Leen BROUNS Danny CHRISTIAENS (Dolmen)

4 Woord vooraf Woord vooraf Als laatstejaarsstudenten Industrieel Ingenieur Informatica wordt verwacht dat we een thesis schrijven. Met deze thesis willen we bewijzen dat we met de tijdens onze opleiding opgedane vaardigheden een nieuwe technologie kunnen verkennen, deze ons ook snel eigen kunnen maken en oplossingen kunnen zoeken voor problemen die bij zo een nieuwe technologie onvermijdelijk zijn. Na het aanschrijven van verschillende bedrijven hadden we met enkele een gesprek omtrent een thesisvoorstel. Een van die bedrijven was Dolmen die ons een voorstel deed om een onderzoek te verrichten naar het.net Framework 3.0 van Microsoft. Daar we beiden over een graduaatsdiploma beschikken en dus wat ervaring hebben met.net, leek dit voor ons een goede keuze. Ook een goede ervaring bij een vorige stage bij Dolmen hielp bij onze beslissing. Gedurende de maand september 2006 liepen we stage bij Dolmen Harelbeke waar we voor het eerst in aanraking kwamen met het nieuwe framework. Hierna hadden we voldoende voeling met de technologie om gedurende het schooljaar en de vakantie zelfstandig aan onze thesis te verder werken. We willen ook enkele personen bedanken die een grote hulp zijn geweest bij het verwezenlijken van deze thesis: Dhr. Danny Christaens, voor het aanbieden van een interessant onderwerp en een stageplaats maar ook voor de vlotte medewerking, goede begeleiding en vele tijd die hij voor ons vrijmaakte. Mevr. Leen Brouns voor de nodige raad en de opvolging van onze thesis. De medewerkers van Dolmen voor de goede werksfeer en hulp bij problemen.

5 Abstract Abstract The introduction of the.net Framework 3.0 was an important moment for Microsoft. By releasing this new set of technologies they wish to change the way that software has been developed for years. To accomplish this, they not only changed the technical possibilities of the.net Framework but also the way it is used. We want to provide an overview of these new capabilities while testing if they live up to the expectations that were raised by Microsoft. We also want to try to make an estimate of the influence this new technology whill have on the software development world as we know it today. De introductie van het.net Framework 3.0 was voor Microsoft een belangrijk moment. Door het lanceren van deze verzameling technologieën willen zij het ontwikkelen van software grondig vernieuwen. Het is namelijk niet alleen de technologie die gewijzigd werd maar ook de manier van ontwikkelen zal voor vele programmeurs nieuw zijn. In deze scriptie gaan we in op de theorie die aangeboden wordt binnen het framework en hoe deze kan gebruikt worden. We kijken ook in hoeverre dit product voldoet aan de vooropgestelde doelen en verwachtingen van zowel Microsoft als de vele.net ontwikkelaars. We proberen daarnaast ook in te schatten wat.net 3.0 kan betekenen voor de toekomst van softwareontwikkeling voor het Windows platform. Keywords:.NET Framework 3.0, WinFX, WPF, Windows Presentation Foundation, Avalon, WCF, Windows Communication Foundation, Indigo, WF, Windows Worfklow Foundation, Windows Cardspace, InfoCard, SOA

6 Inhoud Inhoud Woord vooraf... 2 Abstract... 3 Inhoud... 4 Afkortingen... 8 Figuren, tabellen en code Inleiding Deel 1.Net Framework 3.0 (WinFX) Algemeen Hoofdstuk 1 Windows Communication Foundation Inleiding Service georiënteerde architectuur Service georiënteerd programmeren Business strategie SOA principes Troeven van WCF Eénwording van diverse technologieën Compatibiliteit met applicaties gebaseerd op andere technologieën Ondersteuning van service georiënteerde ontwikkeling Gebruik van Windows Communication Foundation WCF Service Model Gebruiken van een WCF Service Problemen Definiëren van service contracts: Hosten in Managed Windows Service Hosten in IIS Axis Besluit Hoofdstuk 2 Windows Workflow Foundation Workflow Workflows in software Workflow Foundation Basisprincipes Doel Uitwerking Gebruik van WF Enkelvoudige activiteiten Samengestelde activiteiten Activiteiten eigen aan een Sequential Workflow Activiteiten eigen aan een State Machine Workflow Creatie van een workflow... 85

7 Inhoud Creatie van activiteiten Voorwaarden en regels Uitvoeren van een Workflow Levensloop van een Workflow Tracking Persistence Transactions Timer Threading WF en andere technologieën BizTalk Server Microsoft Office SharePoint Services K2.Net Microsoft Office Windows Communication Foundation Besluit Hoofdstuk 3 Windows Presentation Foundation Presentation Foundation Verenigd platform voor user interfaces Vector afbeeldingen Samenwerking tussen ontwerpers en ontwikkelaars Gemeenschappelijke technologie voor Windows en Browser applicaties Gebruik van WPF Applicatie model Layout en controls Stijlen en templates Tekst Documenten Afbeeldingen Audio en video D Graphics D Graphics Transformaties en effecten Animaties Data Binding User Interface automation Toepassingen van WPF Performantie Tools voor WPF Microsoft Visual Studio Microsoft Expression Studio Electric Rain ZAM 3D

8 Inhoud 3.4. WPF en andere technologieën Windows Forms Win32/MFC Direct3D AJAX / Atlas Microsoft Silverlight of WPF / E Windows Xp & Windows Vista Besluit Hoofdstuk 4 CardSpace Inleiding Wat is Identiteit? Digitale identiteit Identiteit metasysteem Rollen Architectuur CardSpace systeem Belangrijkste eigenschappen van CardSpace Werking Information Cards Het verkrijgen van een information card Welke informatie bevat een information card Roaming met information cards Revoken van information cards Gebruik van CardSpace in de praktijk - Gebruiker Configuratiescherm Login Creëren van een self-issued card Installeren van een managed card Gebruik van CardSpace in de praktijk Ontwikkelaar Website met CardSpace login Problemen Fout bij verwerken security token Besluit Deel 2 Dolmen Workflow Services Hoofdstuk 1 Omschrijving van het project Analyse Hoofdstuk 2 Uitwerking Omgeving Databaselaag Windows Workflow Foundation Windows Communication Foundation Service klasse

9 Inhoud Endpoints Host omgeving Windows Presentation Foundation DemandsPage.xaml DemandInfoPage.xaml Candidates.xaml AddCandidate.xaml Admin.xaml Windows CardSpace Inloggen - gebruiker Inloggen - werking ASP.NET Hoofdstuk 3 Handleiding voor installatie Conclusie Literatuurlijst Net 3.0 Algemeen Windows Communication Foundation Windows Workflow Foundation Windows Presentation Foundation Windows Cardspace

10 Afkortingen Afkortingen 2D 3D ACL ADO AES AJAX API ARGB ASP ATLAS B2B BAM BPM CAG CLR COM CPU CSS CTP DCOM DES DLL DNS DPI DSLs DWM EAI ETW GDI HTML IIS MFC MMC MOSS MSMQ OPC PDF RC RMI RSA SAML SDDL SDK SIMD SOA SOAP SQL SSE SSL STS Tweedimensioneel Driedimensioneel Access Control List ActiveX Data Objects Advanced Encryption Standard Asynchronous JavaScript and XML Application Programming Interface Alpha, Red, Green & Blue Active Server Pages ASP.NET AJAX Business-to-business Business Activity Monitoring Business Process Management Conditioned Activity Group Common Language Runtime Component Object Model Central Processing Unit Cascading Style Sheets Client Technology Preview Distributed Component Object Model Data Encryption Standard Dynamically Linked Library Domain Name System Dots Per Inch Domain-specific Languages Desktop Window Manager Enterprise Application Integration Event Tracing for Windows Graphics Device Interface Hypertext Markup Language Internet Information Services Microsoft Foundation Classes Microsoft Management Console Microsoft Office SharePoint Services Microsoft Message Queuing Open Packaging Conventions Portable Document Format Release Candidate Remote Method Invocation Ron Rivest, Adi Shamir and Leonard Adleman Security Assertion Markup Language Security Descriptor Definition Language Software Development Kit Single Instruction, Multiple Data Service Georiënteerde Architectuur Simple Object Access Protocol Structured Query Language Streaming SIMD Extensions Secure Sockets Layer Security Token Services

11 Afkortingen UML URL WAS WCF WDDM WF WPF WPF/E WSDL WSE XAML XBAP XML XPS Unified Modeling Language Uniform Resource Locator Windows Activation Service Windows Communication Foundation Windows Display Driver Model Workflow Foundation Windows Presentation Foundation WPF Everywhere Web Services Description Language Web Services Enhancements extensible Application Markup Language XAML Browse Application Extensible Markup Language XML Paper Specification

12 Figuren, tabellen en code Figuren, tabellen en code Figuur 1: WCF Service-Client Schema Figuur 2: Platformonafhankele communicatie Figuur 3: WS-* specificaties schema Figuur 4: Componenten WCF service Figuur 5: ServiceEndpoint structuur Figuur 6: EndpointAddress structuur Figuur 7: Binding structuur Figuur 8: Binding elementen Figuur 9: Binding beslissingsdiagram Figuur 10: ContractDescription structuur Figuur 11: Service browser informatie Figuur 12: Service WSDL code Figuur 13: Windows Services: RekenmachineService Figuur 14: Logberichten bekijken Figuur 15: Service Model Metadata Utility Tool Figuur 16: Visual Studio: Add Service Reference Figuur 17: Opgeven van het adres van de service Figuur 18: Genereren van codebestanden Figuur 19: Gebruik van service met Java Figuur 20: Foutmelding in logboek Figuur 21: Configuratie standaard website Figuur 22: Toevoegen van.svc extensie Figuur 23: Metabase Explorer Figuur 24: ScriptMaps Properties Window Figuur 25: Axis foutmelding Figuur 26: Aanpassen classpath Figuur 27: Overzicht Windows Workflow Foundation Figuur 28: Code activiteit Figuur 29: Delay activiteit Figuur 30: Throw activiteit Figuur 31: Terminate activiteit Figuur 32: CallExternalMethod activiteit Figuur 33: HandleExternalEvent activiteit Figuur 34: InvokeWebService activiteit Figuur 35: InvokeWorkflow activiteit Figuur 36: Policy activiteit Figuur 37: Suspend activiteit Figuur 38: WebServiceInput activiteit Figuur 39: WebServiceOutput activiteit Figuur 40: WebServiceFault activiteit... 74

13 Figuren, tabellen en code Figuur 41: CancellationHandler met Compensate activiteit Figuur 42: IfElse activiteit met IfElseBranche activiteiten Figuur 43: While activiteit Figuur 44: Sequence activiteit Figuur 45: CompensatableSequence activiteit Figuur 46: Parallel activiteit met Sequence activiteiten Figuur 47: ConditionedActivityGroup activiteit Figuur 48: EventHandlingScope activiteit Figuur 49: Replicator activiteit Figuur 50: SynchronizationScope activiteit Figuur 51: TransactionScope activiteit Figuur 52: CompensatableTransactionScope activiteit Figuur 53: FaultHandlers activiteit met FaultHandler activiteit Figuur 54: Listen activiteit met EventDriven activiteiten Figuur 55: SetState activiteit binnen een EventDriven activiteit Figuur 56: Workflow met drie states Figuur 57: StateInitialization activiteit Figuur 58: StateFinalization activiteit Figuur 59: EventDriven activiteit Figuur 60: Gebruik van code snippets in Visual Studio Figuur 61: Voorbeeld van een property code snippet Figuur 62: Sequential Workflow Figuur 63: Properties venster van de IfElse activiteit Figuur 64: Dialoog venster om de voorwaarde te definiëren Figuur 65: Sequential Workflow Figuur 66: State Machine Workflow Figuur 67: InitialState van de Workflow Figuur 68: Display State van de Workflow Figuur 69: Toolbox met daarin de ShowMessageActivity Figuur 70: Sequential Workflow Figuur 71: Properties venster van de ShowMessage activiteit Figuur 72: Overzicht van alle toestanden waarin een workflow zich kan bevinden Figuur 73: Voorbeeld van een eenvoudige WPF interface Figuur 74: WPF applicatie met stijlen Figuur 75: Applicatie die een Flow document weergeeft Figuur 76: WPF applicatie met een VisualBrush Figuur 77: Begin van de animatie Figuur 78: Latere opname van de animatie Figuur 79: WPF applicatie met data binding Figuur 80: Security tokens bestaande uit verschillende claims Figuur 81: Identiteits Metasysteem architectuur Figuur 82: CardSpace Identity Selector

14 Figuren, tabellen en code Figuur 83: Adresbalk bij website met geldig certificaat Figuur 84: Adresbalk bij website met ongeldig certificaat Figuur 85: Werking CardSpace Figuur 86: CardSpace in private desktop Figuur 87: Details van een card Figuur 88: Logo CardSpace Figuur 89: CardSpace identity selector Figuur 90: Details van de card met onvolledige informatie Figuur 91: Overzicht van de informatie die verstuurd zal worden Figuur 92: Creëren van een self-issued card Figuur 93: Installatie van een managed card Figuur 94: Inlogscherm Figuur 95: Gebruiker selecteert card Figuur 96: Gebruiker dient bijkomende informatie op te geven Figuur 97: Gebruiker krijgt melding dat zijn registratie geslaagd is Figuur 98: Gebruiker is ingelogd Figuur 99: Tabblad Mapbeveiliging bij Default Web Site eigenschappe Figuur 100: Console - Certificaten Figuur 101: Wizard om certificaat te installeren op webserver Figuur 102: Foutmelding in browser door ongeldig certificaat Figuur 103: Startadres van website wijzigen in Visual Studio Figuur 104: Foutmelding bij het verwerken van het security token Figuur 105: Statechart workflow Figuur 106: Project omgeving Figuur 107: SqlPersistenceService databaseschema Figuur 108: WorkflowServicesdatabaseschema Figuur 109: Workflow overzicht Figuur 110: Detail van de verwerking van een update van een aanvraag Figuur 111: Header met Gradient achtergrond Figuur 112: Header met Image achtergrond Figuur 113: DemandsPage.xaml Figuur 114: DemandInfoPage.xaml Figuur 115: Candidates.xaml Figuur 116: AddCandidate.xaml Figuur 117: Admin.xaml Figuur 118: Inlogpagina Figuur 119: Registratie pagina Figuur 120: Mail met gebruikersnaam en paswoord Figuur 121: ASP.NET website als grafische user interface Figuur 122: Publishen van WPF-applicatie

15 Figuren, tabellen en code Tabel 1: Mogelijkheden WCF Tabel 2: Standaard host services Tabel 3: Mogelijke attributen van een property Tabel 4: Verschillende technologieën voor grafische interfaces Code Listing 1: Een eenvoudige service Code Listing 2: Eenvoudige service met gebruik van een interface Code Listing 3: Gebruik van DataContract Code Listing 4: Gebruik van XmlSerializer met ServiceContract Code Listing 5: Gebruik van MessageContract Code Listing 6: Gebruik van ServiceHost Code Listing 7: Configuratie in web.config Code Listing 8: Hosten van een service in arbitrair proces Code Listing 9: Configuratie van endpoints Code Listing 10: Service hosten in Windows Services - Constructor Code Listing 11: Service hosten in Windows Services Starten van service Code Listing 12: Service hosten in Windows Services Stoppen van service Code Listing 13: Service hosten in Windows Services - Logging Code Listing 14: Service hosten in Windows Services Installer klasse Code Listing richtlijn Code Listing 16: Configuratie van een endpoint Code Listing 17: Gebruik van een service Code Listing 18: Configuratie van een endpoint Code Listing 19: Gebruik van een service Code Listing 20: Gebruik van service in Java Code Listing 21: Service met twee interfaces Code Listing 22: Naam geven aan een operation contract Code Listing 23: Originele code van de workflow Code Listing 24: Code van de workflow na toevoegen van de properties Code Listing 25: ExecuteCode methodes van de code activiteiten Code Listing 26: Code van het programma dat de workflow uitvoert Code Listing 27: XML voorstelling van de workflow Code Listing 28: IMessageService interface en MessageEventArgs klasse Code Listing 29: MessageService klasse die de IMessageService interface implementeert Code Listing 30: Code van de workflow Code Listing 31: Execute Code methode van de code activiteit Code Listing 32: Programma dat de workflow uitvoert Code Listing 33: Code van de nieuwe ShowMessageActivity klasse Code Listing 34: Execute methode van de ShowMessageActivity Code Listing 35: Code van de workflow met de aangepaste ExecuteCode methodes Code Listing 36: XAML code die een WPF applicatie definieert Code Listing 37: XAML code voor een Window

16 Figuren, tabellen en code Code Listing 38: XAML code voor een eenvoudige layout Code Listing 39: C# code die bij de interface hoort Code Listing 40: XAML definitie van een stijl Code Listing 41: Toevoegen van een stijl aan een knop Code Listing 42: XAML code voor de definitie van een Flow document Code Listing 43: XAML code van een WPF applicatie met een VisualBrush Code Listing 44: C# code van een WPF applicatie met een VisualBrush Code Listing 45: Animatie op een ellips Code Listing 46: XML bestand met de data voor de applicatie Code Listing 47: XAML code van de applicatie Code Listing 48: Het oproepen van de identity selector in html Code Listing 49: Gegevens uit het token halen Code Listing 50: Inhoud van een security token Code Listing 51: Aanmaken XmlReader Code Listing 52: XmlReader gebruiken om het gebruikte algoritme in te lezen Code Listing 53: Decryptie van het token voor meerdere algoritmes Code Listing 54: transient key decrypteren met private sleutel Code Listing 55: Decryptie van het token Code Listing 56: Constructor van de Token klasse Code Listing 57: WSWorkflow klasse, code die achter de workflow zit Code Listing 58: CandidateEventArgs klasse Code Listing 59: IDemandService interface Code Listing 60: DemancService klasse, implementatie van de IDemandService interface Code Listing 61: WorkflowRuntimeController klasse Code Listing 62: ServiceContract van de WCF-service Code Listing 63: DataContract bij de klasse CandidateInfo Code Listing 64: Implementatie van de IWSWCFService interface Code Listing 65: Configuratie bestand van de service Code Listing 66: XAML code voor de header Code Listing 67: C# code voor de Binding van de Background property Code Listing 68: XAML code voor het fade-in effect Code Listing 69: C# code voor het fade-out effect Code Listing 70: XAML code voor de Textbox stijl Code Listing 71: XAML code voor de GlassButton template Code Listing 72: XAML code voor het overzicht van de aanvragen Code Listing 73: XAML code voor het DataTemplate voor een klant Code Listing 74: C# code voor de databinding Code Listing 75: XAML code voor de data binding op een aantal controls Code Listing 76: Kandidaatinformatie uit DataSet halen en opslaan in een CollectionViewSource Code Listing 77: Filteren van gegevens in een CollectionViewSource Code Listing 78: Sorteren van gegevens in een CollectionViewSource

17 Figuren, tabellen en code Code Listing 79: Groeperen van gegevens in een CollectionViewSource Code Listing 80: XAML code voor de lijst van kandidaten Code Listing 81: DataTemplate voor datatype Candidate Code Listing 82: Kandidaten ophalen en koppelen aan DataContext Code Listing 83: ListBox gebind aan DataContext van de pagina Code Listing 84: Gebruik van een tabcontrol Code Listing 85: Bepalen van de DataContext van een ListView Code Listing 86: Verwerken van het security token Code Listing 87: Creatie van stamp Code Listing 88: Valideren van de timestamp

18 Inleiding Inleiding Eind 2006 werd na lang wachten eindelijk Windows Vista op de markt gebracht. Dit betekende natuurlijk een grote verandering voor de gebruikers van het Windows platform maar ook voor de ontwikkelaars hiervoor. Samen met Vista zag namelijk ook het.net Framework 3.0 het levenslicht. Er was al enige tijd sprake van deze nieuwe omgeving en het is dan ook in de maanden voor het uitkomen van deze software dat dit onderzoek werd opgestart. Windows Vista bevond zich dan nog in een testfase waarbij een aantal bèta, CTP en RC versies beschikbaar werden gesteld, wat voor de nieuwe versie van het.net Framework ook het geval was. Het doel van het onderzoek was dan ook de mogelijkheden van dit nieuwe platform te onderzoeken en na te gaan wat de invloed hiervan kan zijn op het ontwikkelen voor het Windows platform. Het is namelijk belangrijk om het nut van deze nieuwe technologie in te kunnen schatten voordat hiermee een project opgestart wordt. Het eerste deel van dit onderzoek en deze scriptie bestaat uit een theoretisch overzicht van de technologieën binnen.net 3.0. Hierbij hebben we ons gebaseerd op de informatie die te vinden was in boeken en op het Internet. Bij het begin van het onderzoek was deze informatie eerder schaars, ondertussen zijn er al een redelijk aantal boeken verschenen over de diverse onderdelen van.net 3.0. Naarmate ook meer ontwikkelaars deze technologie gebruiken worden er ook meer voorbeeldapplicaties op het Internet geplaatst die kunnen helpen bij de eerste stappen binnen dit framework. De verschillende sites van Microsoft blijven echter een belangrijke bron van informatie. In ons overzicht gaan we zowel in op de technische achtergrond als op de manier waarop deze technologieën gebruikt kunnen worden bij het creëren van applicaties. Door het uitwerken van een aantal kleine voorbeeldapplicaties en opnemen van fragmenten applicatiecode kan dit onderdeel ook een leidraad zijn voor een eerste kennismaking met het framework. Daarnaast kijken we ook naar de wijzigingen die er zijn ten opzichte van vroegere versies van het.net Framework. In de scriptie zien we dan ook dat binnen dit eerste deel, alle onderdelen van het nieuwe framework een hoofdstuk innemen. Omdat theorie natuurlijk niet alles zegt, bevat dit onderzoek ook een proefproject waarmee we de mogelijkheden van het.net 3.0 Framework in de praktijk gebracht hebben. Hierbij hebben we de nadruk gelegd op de vernieuwende onderdelen en deze dan ook zoveel mogelijk gebruikt binnen deze applicatie. We hebben ervoor gekozen om ook bij de beschrijving van het project de onderdelen van het.net 3.0 Framework als hoofdstructuur te gebruiken. Daarbij gaan we vooral wat dieper in op de nieuwe mogelijkheden aan de hand van een aantal codevoorbeelden die de lezer kan gebruiken bij het ontwikkelen van nieuwe applicaties. Met deze scriptie hopen we dan ook een vrij volledige maar ook begrijpbare inleiding te geven op het.net Framework 3.0 en de mogelijkheden ervan. We hopen ook om hiermee mensen

19 Inleiding aan te zetten om ten volle gebruik te maken van deze nieuwe opties en daardoor betere applicaties te realiseren.

20 Deel 1.Net Framework 3.0 (WinFX) 18

21 Algemeen Algemeen In dit eerste deel wordt het.net Framework 3.0 vooral theoretisch ontleed en beschreven. Hierbij bespreken we zowel de essentie van de technologie en de mogelijkheden ervan, als de manier waarop ze opgebouwd is en hoe ze gebruikt kan worden. Waar nodig gaan we ook in op een aantal algemene concepten die niet noodzakelijk deel uitmaken van het.net Framework 3.0 maar die wel belangrijk zijn om de opbouw of de implementatie ervan te begrijpen. De volgende hoofdstukken handelen elk over één van de vier onderdelen van het nieuwe framework en bevatten zowel een algemeen overzicht als een gedetailleerde uitwerking van de onderdelen en mogelijkheden. Daarnaast is er ook plaats voor een aantal voorbeeldapplicaties of codefragmenten die de stap naar de praktijk mogelijk maken. Ook maken we de vergelijking met andere technologieën die vergelijkbare of verwante mogelijkheden aanbieden en proberen duidelijk te maken wanneer welke technologie het best gebruikt wordt. 19

22 Windows Communication Foundation Hoofdstuk 1 Windows Communication Foundation 1.1. Inleiding Vandaag de dag worden de meeste applicaties opgebouwd via een object georiënteerde architectuur. Wanneer men echter applicaties wenst te doen communiceren met elkaar, is een objectgeoriënteerde benadering verre van ideaal. Indien men dit wenst te verwezenlijken, opteert men beter voor een service georiënteerde benadering. Technologieën om service georiënteerde applicaties te ontwikkelen bestaan reeds, denk maar aan COM, DCOM, RMI,. Maar veel van deze technologieën werken wel in bepaalde scenario s, maar niet in ieder scenario. Daarom ontwikkelde Microsoft de Windows Communication Foundation of kortweg WCF (vroeger Indigo genaamd). WCF moet het mogelijk maken dat ongeacht de omstandigheden, stukken software met elkaar kunnen communiceren. Vooraleer dieper in te gaan op WCF, wordt eerst het waarom van service georiënteerde architectuur (SOA) besproken Service georiënteerde architectuur Een service georiënteerde architectuur kan beschreven worden als een groepering van enkelvoudige of samengestelde eenheden die onafhankelijk van elkaar services leveren. Een service kan beschouwd worden als een stuk werk dat je laat uitvoeren door een derde. De communicatie tussen deze eenheden is aan regels gebonden. Deze regels worden vastgelegd door afspraken en contracten. Om van zo een dergelijke service gebruik te maken is het voldoende om te weten welke diensten deze aanbiedt en hoe van deze diensten gebruik te maken. Hoe de service intern werkt, is voor de gebruiker van geen enkel belang Service georiënteerd programmeren Om uit te leggen wat service georiënteerd programmeren precies is, zullen we object georiënteerd programmeren als startpunt nemen. Het uitgangspunt van object georiënteerd programmeren is dat werken met een geheel, eenvoudiger is dan het werken met en verstaan van alle onderdelen van dat geheel. Een programmeur zal een klasse ontwikkelen voor zo een dergelijk geheel. Een heel populaire taal om object georiënteerd te programmeren is C++. Hierbij kan men bepaalde leden en methodes van een klasse verborgen houden. Dit kan men zien als de interface van die klasse. Een belangrijk nadeel is dat er voor C++ compilers geen standaard is voor het publiceren van interfaces. Hierdoor is het mogelijk dat er fouten optreden wanneer men een klasse aanspreekt 20

23 Windows Communication Foundation in een DLL file, vanuit code die gebruik maakt van een andere compiler dan de compiler van klasse uit de DLL. Dit is een belangrijk nadeel bij het hergebruik van code, wat vandaag toch heel belangrijk is bij het ontwikkelen van software. Voor dit probleem zijn twee oplossingen: De ene oplossing is het definiëren van interfaces door gebruik te maken van abstracte klassen. Programmeren met interfaces gedefinieerd met abstracte klassen in C++ vormt de basis van component georiënteerd programmeren en wordt ook gebruikt bij het Component Object Model (COM). De andere oplossing is het definiëren van een standaard voor de output voor compilers. Dit is mogelijk via de Java Virtual Machine Specification (Java ) of de Common Language Runtime Specification (.NET). Het compiler probleem is hiermee opgelost, maar toch zijn er nog beperkingen voor hergebruik. Het is namelijk nog niet mogelijk om in Java op een eenvoudige manier COM of.net klassen te gebruiken. Hiervoor biedt de Web Services Description Language (WSDL) een oplossing. Met WSDL kan men een software interface definieren in XML, zodat een eenvoudige samenwerking tussen Java en COM/.Net mogelijk is. Het schrijven van klassen die WSDL interfaces implementeren noemt men service georiënteerd programmeren Business strategie Service-georiënteerd denken is niet per se een IT-begrip maar is ook goed toepasbaar in het kader van de business strategie. Na de tweede wereldoorlog bestond de bedrijfstrategie vooral uit het opvoeren van de productiecapaciteit en het verbeteren van de efficiëntie. In die tijd waren het de fabrikanten die de macht in handen hadden. Alles wat men produceerde werd verkocht want de consument kon slecht kiezen uit een beperkt aanbod. Dit systeem werkte perfect zolang de markt niet veranderde. Maar door de technologische vooruitgang werd de markt voor de consument groter en kreeg die ook meer controle over wat hij kon kopen, kortom de markt werd groter. De ontwikkelingen op technologisch gebied hebben er echter voor gezorgd dat de wereld steeds kleiner werd. Dit heeft geleid tot een situatie waarin elke mens met elk anders mens waar ook ter wereld kan communiceren. Als de wereld steeds kleiner wordt, dan wordt de markt 21

24 Windows Communication Foundation voor iedere fabrikant steeds groter en heeft de consument ook een ruimere keuze. Dit heeft tot gevolg dat de macht is verschoven van fabrikant naar consument. Het is de consument die zijn eisen stelt aan de fabrikanten die uiteraard producten moeten gaan produceren die voldoen aan de eisen van deze consument. Daar deze eisen snel veranderen, spelen de fabrikanten op een voortdurend veranderende markt. Door deze veranderingen moet de bedrijfstrategie worden aangepast. Het volstaat niet meer om de dingen zo efficiënt mogelijk te maken. Men moet manieren zoeken om hun producten beter te maken dan de concurrentie. Om hierin te slagen moet men zich concentreren op de eigen kernactiviteiten en de rest overlaten aan derden. Deze nieuwe strategie leidt tot het opdelen van een traditionele bedrijfsstructuur in een aantal modulaire afdelingen die elk een service leveren in de totale bedrijfsketen. Het voordeel hiervan is dat men per afdeling kan nagaan of de services die de afdeling levert behoren tot de kernactiviteiten van een onderneming en of de werking van die afdeling verbeterd kan worden. Indien service van een afdeling niet tot de kernactiviteiten behoort, kan men deze makkelijk uitbesteden aan een derde aangezien afdelingen onafhankelijk zijn van elkaar. Het is natuurlijk wel belangrijk dat de onderneming die zijn activiteiten uitbesteedt wel nog de controle heeft over deze activiteit. Daarom worden er tussen beide partijen afspraken en contracten gemaakt die eventueel gestandaardiseerd kunnen worden. Het is duidelijk dat er een verband bestaat tussen service georiënteerde architectuur en het bepalen van een bedrijfsstrategie: in beide gevallen biedt een derde een service aan en is het ook belangrijk dat er duidelijke afspraken en contracten bestaan SOA principes Zoals eerder vermeld bestaat SOA uit onafhankelijke eenheden (services) met elk hun eigen gedrag en mogelijkheden (capabilities) die op de één of andere manier samenwerken of communiceren. Deze communicatie gebeurt via berichten, meestal in een vraag-antwoord vorm. Wanneer men zich baseert op SOA bij het ontwikkelen van applicaties, moet men rekening houden met volgende basisregels. 1) Een service heeft een duidelijke grens Het moet duidelijk zijn wanneer men zich binnen een service bevindt of erbuiten. De enige manier om een service aan te spreken is door er een bericht naar te sturen. Een service kan slechts een actie uitvoeren als deze een bericht ontvangen heeft. 22

25 Windows Communication Foundation 2) Services zijn autonoom Wanneer een gebruiker gebruik wenst te maken van een service, gebruikt hij de interface van de service. Afgezien van deze interface zijn beide volledig onafhankelijk van elkaar. Welke technologie de service gebruikt, waar de service is gelokaliseerd, het kan allemaal autonoom bepaald worden. Men kan zonder probleem de ene service aanpassen zonder dat er ook veranderingen nodig zijn aan andere services. 3) Samenwerking tussen services is gebaseerd op policies Hoe een service intern werkt hoeft een gebruiker niet te weten. Wel kan het handig zijn om te weten wat de algemene voorwaarden, kwaliteit, verwerkingstijd en andere eigenschappen van een service zijn. Deze informatie, die in feite weinig te maken heeft met de inhoud van de service, wordt beschreven in zogenaamde policies. 4) Services delen alleen schema en contract Het enige wat een gebruiker moet weten over een service is met welke taal hij deze service moet aanspreken, en de manier waarop er met de service kan gecommuniceerd worden. Het schema beschrijft de syntax en de taal van de individuele berichten waarmee de service aangesproken kan worden en waarmee de service zelf communiceert. Het contract beschrijft de dialoogvorming tussen de gebruiker en service (bvb. vraag-antwoord). Toegepast op een voorbeeld: stel dat als je gebruik wenst te maken van een service, je een invulformulier moet invullen. Dit formulier kan men zien als het schema. Het ingevulde formulier moet dan opgestuurd worden naar adres X. Indien goed ontvangen krijg je een bevestiging. Indien goedgekeurd krijg je een toegangscode. Deze opeenvolging van acties kan aanzien worden als het contract Troeven van WCF Wanneer men Windows applicaties wenst te ontwikkelen, zal men in vele gevallen voor het.net Framework kiezen. WCF is geïmplementeerd als een set van klassen bovenop de Common Language Runtime (CLR) van het.net Framework 2.0. Op die manier biedt WCF een vertrouwde omgeving aan voor ontwikkelaars. Zo kunnen ontwikkelaars die vertrouwd zijn met het ontwikkelen van object georiënteerde applicaties, nu op een gelijkaardige manier service georiënteerde applicaties ontwikkelen. 23

26 Windows Communication Foundation Figuur 1: WCF Service-Client Schema Bovenstaande figuur toont het schema van een eenvoudige WCF service en client. Beiden communiceren via SOAP, dit is het standaard protocol van WCF. Op de figuur zijn beiden gebouwd op WCF, maar door het gebruik van SOAP is dit zeker geen vereiste Eénwording van diverse technologieën Microsoft heeft reeds een aantal technologieën ontwikkeld die het mogelijk maken om tussen verschillende applicaties te communiceren. Deze worden eerst even kort besproken. ASMX: beter gekend als ASP.NET Web Services. Hiermee kan je op een relatief eenvoudige manier web services creëren die kunnen communiceren met web services (die eventueel op een andere platform (bvb J2EE) zijn gebouwd). ASMX wordt heden ten dage door de meeste platformen ondersteund. Deze technologie is gebaseerd op het http-protocol en maakt gebruik van XML, SOAP en WSDL..Net Remoting: is specifiek ontworpen voor communicatie tussen applicaties die beide op het.net Framework zijn gebouwd. Voordeel van deze technologie is dat een hoge performantie wordt gehaald, o.a. door het ondersteunen van state-managment (terwijl ASMX statusloos werkt). Enterprise Services: wanneer COM+ services worden gebruikt via.net, spreekt men van Enterprise Services. Hiermee kan de levensloop van objecten worden beheerd en zorgt dit voor ondersteuning van transacties. Nadeel hier is dat er slechts een beperkt aantal protocols worden ondersteund. Web Services Enhancements (WSE): ook hiermee kan je, net zoals met ASMX, communiceren met applicaties die gebouwd zijn op een ander platform. Extra voordeel is de ondersteuning van de WS-* specificaties die later worden besproken. Microsoft Message Queuing (MSMQ): wordt gebruikt wanneer er moet gecommuniceerd worden met applicaties die niet altijd beschikbaar zijn. Hierbij worden, zoals de naam doet vermoeden, berichten die niet direct verwerkt kunnen worden, in een wachtrij geplaatst en kunnen die er later weer afgehaald worden voor verwerking. Voorwaarde is wel dat beide applicaties op Windows gebaseerd zijn. 24

27 Windows Communication Foundation Op zich werken deze technologieën prima. Maar ontwikkelaars moeten één specifieke technologie kiezen bij het ontwikkelen van een applicatie. Terwijl men vaak een behoefte heeft aan een mengeling van meerdere van deze technologieën. WCF lost dit probleem op en zorgt ervoor dat er geen keuze hoeft gemaakt te worden omdat deze technologieën standaard binnen WCF worden ondersteund. Tabel 1: Mogelijkheden WCF Vele bedrijven gebruiken vandaag toepassingen die gebaseerd zijn op het.net Framework 2.0. Daar WCF een toevoeging aan het.net Framework 2.0 is, heeft een installatie van WCF geen invloed op bestaande applicaties. Applicaties ontwikkeld in WCF kunnen in de meeste gevallen communiceren met bestaande applicaties die ontwikkeld werden in het.net Framework 2.0. Zo kan een WCF-applicatie communiceren met een ASMX-applicatie omdat beiden SOAP gebruiken voor de communicatie. Er kan een WCF-wrapper klasse geschreven worden rond bestaande Enterprise Services applicaties zodat ook hier communicatie mogelijk is. WCF maakt rechtstreeks gebruik van MSMQ zodat compatibiliteit ook hier geen probleem vormt. Wel dient opgelet te worden bij het gebruik van WSE. WCF ondersteunt enkel WSE Compatibiliteit met applicaties gebaseerd op andere technologieën Hoewel WCF zorgt voor een nieuwe ontwikkelomgeving, is het ook ontworpen om compatibel te zijn met niet op WCF gebaseerde toepassingen. Hierin wordt onderscheid gemaakt tussen Microsoft en niet-microsoft platformen. Vandaag de dag gebruiken bedrijven diverse systemen en applicaties die ontwikkeld zijn door verschillende aanbieders op verschillende platformen. Door het gebruik van WCF is communicatie tussen die verschillende applicaties mogelijk. 25

28 Windows Communication Foundation Zoals aangegeven in onderstaande figuur kan een applicatie die op WCF gebouwd is, communiceren met: Een op WCF gebaseerde applicatie die op dezelfde Windows machine draait (maar wel in een ander proces). Een op WCF gebaseerde applicatie die draait op een andere Windows machine. Applicaties die gebouwd zijn op andere technologieën zoals J2EE. Zolang deze technologieën standaard Web Services ondersteunen, is communicatie mogelijk. Ook het besturingssysteem van de machine waarop de applicatie draait speelt geen rol. Figuur 2: Platformonafhankele communicatie Om meer dan eenvoudige communicatie tussen systemen toe te laten, implementeert WCF de WS-* specificaties WS-* specificaties WS-* specificaties werden hoofdzakelijk ontwikkeld door Microsoft en IBM. Later werden deze door OASIS als standaard aanvaard. Deze specificaties zorgen voor beveiliging, betrouwbaarheid en ondersteuning van transacties. Ze zorgen ook voor ondersteuning van het uitwisselen van metadata. Enkel de door WCF ondersteunde specificaties worden hier besproken. Figuur 3: WS-* specificaties schema 26

29 Windows Communication Foundation Zoals in bovenstaande figuur duidelijk te zien is, zijn de specificaties bovenop de XMLstandaard gebouwd. De verschillende specificaties worden per categorie kort besproken Messaging-specificaties SOAP: Simple Object Acces Protocol wordt gebruikt om informatie uit te wisselen in een gedecentraliseerde en gedistribueerde omgeving en is gebaseerd op XML. WS-Addressing: zorgt ervoor dat SOAP-berichten kunnen geadresseerd worden, onafhankelijk van het onderliggende transportprotocol. Zorgt er ook voor dat berichten kunnen worden verstuurd binnen een netwerk met gateways, firewalls, MTOM: Message Transmission Optimization Mechanism definieert een geoptimaliseerd formaat voor SOAP berichten Security-specificaties WS-Security: zorgt voor integriteit, confidentialiteit en authenticiteit bij SOAP-berichten. WS-Trust: uitbreiding op WS-Security om security tokens aan te vragen en te versturen om op die manier een betrouwbare (in beveiligings aspect) verbinding tot stand te brengen. Kan ook gebruikt worden om betrouwbare relaties te beheren. WS-SecureConversation: uitbreiding op WS-Security om een beveiligde communicatie te garanderen Reliable Messaging -specificaties WS-Reliable Messaging: definieert extra velden in de SOAP header zodat een betrouwbare (in transport aspect) end-to-end communicatie mogelijk is, zelf wanneer er intermediaire SOAP servers op het pad liggen Transaction-specificaties WS-Coordination: beschrijft een framework om acties van distributed applications te coördineren. Het biedt alleen een framework en kan dus niet zonder andere transactionspecificaties. WS-AtomicTransaction: beschrijft protocollen voor atomaire transacties (zoals twophrase commit). Wordt samen gebruikt met WS-Coordination Metadata WSDL: Web Services Description Language is een op XML gebaseerde taal die dient om services te beschrijven. Deze bevat bijvoorbeeld hoe een bepaalde service dient gebruikt te worden en welke services ze aanbiedt (interface). WS-Policy: laat toe ook andere data omtrent een service te specificeren. Bvb: verwerkingtijd, kwaliteit van de service, WS-MetadataExchance: laat een gebruiker toe om policies of andere informatie op te vragen van een service die gedefinieerd is in WSDL. 27

30 Windows Communication Foundation Ondersteuning van service georiënteerde ontwikkeling Zoals reeds eerder vermeld, biedt WCF een framework voor het ontwikkelen van applicaties gebaseerd op een service georiënteerde architectuur. Dit was een van de hoofddoelen van Microsoft toen het met de ontwikkeling startte. Daarom hebben de ontwikkelaars van WCF rekening gehouden met de 4 SOA principes (zoals besproken in SOA principes) Een service heeft een duidelijke grens. Services zijn autonoom. Samenwerking tussen services is gebaseerd op policies. Services delen alleen schema en contract Gebruik van Windows Communication Foundation WCF is meer dan de samensmelting van diverse technologieën. Het is een software factory template voor software communicatie. Het gebruik van dergelijke templates is een nieuwe benadering op model driven software ontwikkeling. Model driven ontwikkeling is reeds vele jaren populair. Bij dergelijke ontwikkeling creëert men abstracte modellen van een applicatie op verschillende niveaus van detail in plaats van op de code. Op basis van het meeste gedetailleerde model kan men een stuk van de code gaan genereren. Het is belangrijk dat dit model aan alle vereisten voldoet vooraleer men code gaat genereren. Men kan dergelijke modellen gaan opstellen door gebruik te maken van zogenaamde general purpose modeling talen zoals UML (Unified Modeling Language). Een nadeel bij het gebruik van general purpose modeling talen om modellen op te stellen, is dat ze niet precies genoeg zijn. Ze kunnen bepaalde vereisten niet in detail gaan beschrijven zoals bvb. in spreektaal. Ook details omtrent geheugenbeheer, thread synchronisatie, kunnen niet precies genoeg beschreven worden. Deden ze dit wel dan zouden het eerder programmeertalen zijn dan modelleertalen. Toch zijn deze details belangrijk voor een ontwikkelaar. Door deze tekortkomingen is het beter om domain-specific languages (DSLs) te gebruiken bij model drivin ontwikkeling. DSLs beschrijven modellen binnen een specifiek domein en worden in samenwerking met een framework gebruikt. Dit framework bevat klassen die specifiek ontwikkeld zijn voor datzelfde domein. Op die manier is het mogelijk om van een DSLs model code te gaan genereren. De combinatie van DSLs en een overeenkomstig framework vormt de kern van software factory templates. Een voorbeeld van een software factory template is de Windows Forms Designer in Visual Studio. Hier is Windows Forms Designer de DSL en de klassen in de namespace System.Windows.Forms van de.net Framework Class Library vormen het framework. Een ontwikkelaar kan via de designer tekstvelden, drukknopen en andere componenten op 28

31 Windows Communication Foundation formulieren plaatsen, kortom het model opstellen. Daarna wordt door gebruik te maken van de juiste klassen, de code voor dat formulier gegenereerd. Zoals reeds eerder vermeld is WCF een software factory template voor software communicatie. De DSL van deze template heet het Service Model en het framework heet Channel Layer. Het Service Model bestaat uit klassen van de namespace System.ServiceModel en een op XML gebaseerde configuratie taal. Channel layer bestaat uit klassen van de namespace System.ServiceModel.Channel. Ontwikkelaars gaan modelleren hoe de software moet communiceren door gebruik te maken van het Service Model. De Channel layer zal dan de code gaan genereren op basis van het model. Wanneer een ontwikkelaar de manier waarop de software communiceert wenst te wijzigen, volstaat het deze wijzigingen aan te passen in het model en de aangepaste code zal onmiddellijk gegenereerd worden. Wanneer men gebruik wenst te maken van een communicatie die niet ondersteund wordt door de Channel Layer, is het mogelijk om zelf een channel te definiëren en deze dan toe te voegen aan de Channel Layer. (Net zoals je in de Windows Form Designer zelf componenten kan definiëren en deze toevoegen aan de toolbox) WCF Service Model De sleutelwoorden in de taal van het WCF Service Model verschillen niet veel van die in WSDL. In WSDL wordt een stuk software dat kan communiceren met andere software een service genoemd. Een service wordt met WSDL beschreven in een XML document met drie primaire secties: De service sectie die aanduidt waar de service gelokaliseerd is. De binding sectie definieert met welke protocollen de service kan aangesproken worden. De porttype sectie bevat definieert alle operaties die de service ondersteunt. De drie primaire secties in een WSDL document vertellen dus waar de service terug te vinden is, hoe men ermee kan communiceren en wat de service kan. Ook wanneer men communicerende software ontwikkelt via het WCF Service Model moet men deze drie zaken gaan definiëren. In plaats van de termen service, binding en porttype te gaan gebruiken zoals in WSDL, worden in het WCF Service Model, de termen address, binding en contract gebruikt. Deze termen worden later meer in detail bekeken. In het WCF Service Model wordt de term service gebruikt voor een stuk software dat met andere software kan communiceren. 29

32 Windows Communication Foundation Een WCF service bestaat uit 3 componenten: Service klasse: dit is een klasse die geïmplementeerd is in een CLR-taal: C#, Visual Basic, Endpoints: elke service beschikt over een of meerdere endpoints. Als een client gebruik wenst te maken van een service, moet de communicatie gebeuren via een endpoint. Dit is de enige manier om met de service te communiceren. Host omgeving: deze bestaat uit een application domain en een proces. De service draait in deze host omgeving die zorgt voor het ontvangen en versturen van berichten. Figuur 4: Componenten WCF service Service klasse Sommige zaken zullen verduidelijkt worden aan de hand van een code voorbeeld. Hiervoor zullen we gebruik maken van C#, maar dit kan evengoed elke CRL-taal zijn. Een WCF service klasse ziet er uit als een gewone klasse maar dan met toevoeging van enkele parameters. Deze parameters laten toe dat de ontwikkelaar één of meerdere contracts definieert die deze klasse zal implementeren. (Contracts zullen terugkeren bij de bespreking van endpoints). Een WCF service klasse definieert minstens één service contract en eventueel een of meerdere data contracts. Een service contract definieert welke methodes de service zal aanbieden aan gebruikers. Een data contract definieert de data die zal gebruikt worden bij het uitvoeren van een dergelijke methode Service Contracts Met deze contracts kan een ontwikkelaar bepalen welke methodes al dan niet worden aangeboden in de service. Daar men deze contracts moet kunnen definiëren in iedere CRLtaal, hebben de ontwikkelaars van WCF ervoor gekozen dit te doen via attributen. Dit zijn karakters die geplaatst kunnen worden vóór klasse of methode definities. Op zich is er niets nieuws aan deze attributen. Ze werden reeds gebruik bij o.a. ASMX. Zo laat men een webservice methode in ASMX voorafgaan door een WebMethod attribuut. Het belangrijkste attribuut bij WCF is ServiceContract. Een klasse die wordt voorafgegaan door een ServiceContract attribuut is een WCF service klasse. 30

33 Windows Communication Foundation Stel dat we een service willen creëren die de functies van een rekenmachine zou aanbieden, dan zou de code er ongeveer zo uitzien: using System.ServiceModel; [ServiceContract] class Rekenmachine [OperationContract] private int Optellen(int a, int b) return a + b; [OperationContract] public int Aftrekken(int a, int b) return a - b; private int Vermenigvuldig(int a, int b) return a * b; public int Delen(int a, int b) return a / b; Code Listing 1: Een eenvoudige service De gebruikte attributen zijn gedefinieerd in de namespace System.ServiceModel. Daar vóór de klasse Rekenmachine, het ServiceContract attribuut is geplaatst, is deze klasse een WCF web service klasse. Indien men een methode wil beschikbaar maken voor een gebruiker van de service, moet men het attribuut OperationContract plaatsen voor de methode. Op die manier zullen deze methodes automatisch opgenomen worden in het service contract van de service. In het voorbeeld zal een gebruiker de methodes Optellen en Aftrekken kunnen gebruiken. Belangrijk is dat hier zowel services als objecten afhangen van contracts die volledig onafhankelijk zijn van elkaar. Objecten zullen gebruik maken van object contracts om te bepalen welke methodes van het object, toegankelijk zijn voor andere objecten binnen de applicatie. De toegang zal worden bepaalde door private of public. In het voorbeeld zal het object contract van Rekenmachine enkel de methodes Aftrekken en Delen toegankelijk maken. Rekenmachine heeft naast een object contract, ook een service contract. Of een gebruiker al dan niet toegang heeft tot methodes van de service wordt hier niet bepaalde door private of public, maar wel door het OperationContract attribuut. In het voorbeeld zal een gebruiker dus gebruik kunnen maken van de methodes Optellen en Aftrekken. Op deze manier is onze klasse gekoppeld aan één service contract. Het is ook mogelijk om meerdere contracten aan een klasse te koppelen. Dit kan door het toepassen van het attribuut ServiceContract op een interface. Dit wordt getoond in volgend voorbeeld: 31

34 Windows Communication Foundation [ServiceContract] interface IRekenmachineLager [OperationContract] int Optellen(int a, int b); [OperationContract] int Aftrekken(int a, int b); [ServiceContract] interface IRekenmachineHoger [OperationContract] int Optellen(int a, int b); [OperationContract] int Aftrekken(int a, int b); [OperationContract] int Vermenigvuldig(int a, int b); [OperationContract] int Delen(int a, int b); class Rekenmachine: IRekenmachineLager,IRekenmachineHoger public int Optellen(int a, int b) return a + b; public int Aftrekken(int a, int b) return a - b; public int Vermenigvuldig(int a, int b) return a * b; public int Delen(int a, int b) return a / b; Code Listing 2: Eenvoudige service met gebruik van een interface Op deze manier kan heeft de klasse Rekenmachine nu twee service contracts. De ene kan bvb. gebruikt worden voor het lager onderwijs waar alleen optellen en aftrekken nodig is, terwijl de andere alle bewerkingen toelaat voor het hoger onderwijs. Het gebruik van ServiceContract en OperationContract laat toe dat er automatisch contract definities in WSDL worden gegenereerd. Het is ook mogelijk om een WCF service klasse te creëren op basis van een WSDL document Data Contracts Een data contract van een service bevat een beschrijving van de data types, die van en naar de service worden gestuurd. Data die tussen services uitgewisseld wordt, wordt geserialiseerd van 32

35 Windows Communication Foundation het datatype zoals het in het geheugen zit, naar een representatie in XML. Hoe die serialisatie plaatsvindt hangt af van de serialization engine die gebruikt wordt. WCF gebruikt standaard DataContract. Dit is een vereenvoudigde versie van de XmlSerializer die standaard gebruikt wordt bij ASMX. Voor eenvoudige datatypes zoals integers, strings, doubles, is het niet nodig zelf een data contract te maken. Als men daarentegen gebruik wenst te maken van structs of zelf gedefinieerde klassen, dient men wel een data contract op te stellen. In WCF kan men een data contract definiëren door gebruik te maken van het attribuut DataContract. Dit wordt voor de definitie van klasse, struct, geplaatst. Per lid kan dan gebruik gemaakt worden van het attribuut DataMember, om aan te duiden dat het lid moet geserialiseerd worden. Opnieuw spelen private en public geen rol bij data contracts. Stel dat we persoonsgegevens wensen door te sturen door gebruik te maken van object van het type Persoon. Dan zal het data contract er ongeveer zo uitzien: [DataContract] public class Persoon public int id; [DataMember] public string naam; [DataMember] private string voornaam; Code Listing 3: Gebruik van DataContract Wanneer een gebruiker een object van het type Persoon ontvangt van een service, bevat dat object enkel de velden naam en voornaam. Wanneer men ASMX web services wil converteren naar WCF web services kan men in plaats van DataContract, XmlSerializer gebruiken. Dit kan op volgende wijze: [ServiceContract] [XmlSerializer] class Rekenmachine Code Listing 4: Gebruik van XmlSerializer met ServiceContract Merk op dat niets standaard wordt opgenomen in de service. Het is aan de ontwikkelaar om met de attributen ServiceContract en DataContract, klassen aan te duiden die een WCF contract aanbieden en dus gebruikt kunnen worden in een service. Binnen zo een klasse moeten de attributen DataMember en OperationContract gebruikt worden om specifieke leden te publiceren. Hiermee is voldaan aan één van de vier principes van SOA, nl.: Een service heeft een duidelijke grens. 33

36 Windows Communication Foundation In alle voorbeelden die tot nu toe werden besproken, zorgde WCF er automatisch voor dat parameters en return waarden in de body van een SOAP bericht terecht kwamen. Wanneer men informatie in de header van een SOAP bericht wil plaatsen, kan dit via een Message Contract. We zullen dit opnieuw aantonen aan de hand van een voorbeeld. Stel dat we via een service, informatie over een werknemer wensen te versturen. Het is de bedoeling dat de persoonsinformatie in de SOAP-header staat en de functie omschrijving in de SOAP-body. [MessageContract] public class Werknemersinfo [MessageHeader] public Persoon persoon; [MessageBodyMember] public string omschrijving; [ServiceContract] public interface IWerkenemersInfo [OperationContract] void GeefInfo(Werknemersinfo inf); Code Listing 5: Gebruik van MessageContract Het MessageContract attribuut wordt vóór de klasse Werknemersinfo geplaatst. Een object van deze klasse bevat de informatie die zal worden uitgewisseld. Het MessageHeader attribuut vóór Persoon zal ervoor zorgen dat deze informatie in de SOAPheader zal worden geplaatst. Het MessageBodyMember attribuut zorgt ervoor dat de omschrijving in de SOAP-body zal worden geplaatst Endpoints Componenten De endpoints van een service zijn contactpunten waarmee een client kan verbinden met de service. Alle communicatie kan enkel via deze contactpunten. Een endpoint wordt voorgesteld door de klasse ServiceEndpoint. Een endpoint bestaat uit 3 componenten (ook wel het ABC van WCF genoemd): Address: dit is het adres waarnaar de client zijn berichten moet versturen of anders gezegd, de plaats waar het endpoint te vinden is. Het address is niet meer dan de URI van het endpoint. Een address wordt voorgesteld door de klasse EndpointAddress. Binding: specificeert hoe het endpoint communiceert met de buitenwereld, zoals het transport protocol (TCP,HTTP, ), encodering (binair, tekst, ) en security vereisten. Voor de binding van een service wordt de klasse Binding gebruikt. 34

37 Windows Communication Foundation Contract: specificeert wat de service aanbiedt. Wanneer het attribuut ServiceContract vóór een klasse wordt geplaatst die geen interface implementeert, dan kan die slecht één contract hebben. De eerste versie van de Rekenmachine kan dus slecht één contract hebben. Wanneer er echter met interfaces wordt gewerkt, zoals in de 2 de versie van de rekenmachine, is er de mogelijkheid om meerdere contracten te hebben. Het contract van een service wordt voorgesteld door de ContractDescription klasse. Deze drie componenten zijn volledig onafhankelijk van elkaar. Een contract kan meerdere bindings ondersteunen en een binding kan meerdere contracts ondersteunen. Een service kan ook meerdere endpoints hebben die tegelijk toegankelijk zijn. Het is mogelijk dat een service bepaalde eisen stelt aan zijn binding(s). Dit kan gaan over security, betrouwbaarheid,. Wanneer een binding niet voldoet aan de eisen van de service, dan zal deze service niet opstarten. De klassen die hier worden gebruikt zijn terug te vinden in de namespace System.ServiceModel.Description. Figuur 5: ServiceEndpoint structuur EndpointAddress Een EndpointAddress bevat een URI, optionele AddressHeader(s) en een Identity. De URI bevat de locatie van het endpoint. De Identity geeft een id aan het endpoint en bevat normaal dezelfde waarde als de URI. Maar in meer geavanceerde scenario s, kan het mogelijk zijn dat deze van elkaar moeten verschillen. De AddressHeader(s) biedt de mogelijkheid om adresseringsinformatie in te stellen bovenop de URI. Dit is bvb. nodig wanneer meerdere endpoints dezelfde URI delen. 35

38 Windows Communication Foundation Figuur 6: EndpointAddress structuur Binding Een binding heeft een naam, een namespace en een collectie van het type BindingElement. De naam en namespace geven een unieke naam aan de binding. Ieder element in de BindingElement-collectie beschrijft een aspect over hoe het endpoint zal communiceren met de buitenwereld. Figuur 7: Binding structuur In Figuur 7 zien we de BindingElement-collectie van een binding. Deze collectie bevat 3 elementen: TcpTransportBindingElement: communicatie zal gebeuren met TCP als transportprotocol. ReliableSessionBindingElement: zal voor een betrouwbare communicatie zorgen. SecurityBindingElement: er zal gebruik gemaakt worden van beveiligde SOAP communicatie. Ieder element heeft verder nog eigenschappen om specifieke waarden in te stellen. De volgorde waarmee elementen worden toegevoegd is belangrijk. Het element dat laatst wordt toegevoegd, bevindt zich onderaan in de stapel van elementen. Inkomende berichten zullen stijgen in de stapel terwijl uitgaande berichten dalen. De volgorde beïnvloed dus de manier waarop berichten worden verwerkt. 36

39 Windows Communication Foundation Figuur 8: Binding elementen De ontwikkelaar heeft de mogelijkheid om een binding te kiezen uit de standaard bindings die WCF aanbiedt. Hij heeft ook de mogelijkheid deze bindings aan te passen of ze helemaal zelf te creëren. Standaard bindings WCF voorziet in enkele voorgedefineerde bindings die in de meest voorkomende situaties gebruikt kunnen worden. Deze worden kort besproken: BasicHttp: een van de meest gebruikte bindings voor communicatie over het internet. Binnen deze optie kan er bepaald worden welke security er wordt gebruikt: geen, HTTPS, SOAP-security of HTTPS met SOAP security. NetTcp: een van de meest gebruikte bindings voor communicatie over het intranet. Deze is performanter dan BasicHttp maar is enkel geschikt voor WCF-to-WCF communicatie. Er is de mogelijkheid om security toe te passen op transport en bericht niveau. NetNamedPipe: is gelijkaardig aan NetTcp, maar NetNamedPipe is enkel geschikt voor communicatie binnen eenzelfde machine. WsHttp: is gelijkaardig aan BasicHttp met dat verschil dat WsHttp ook transacties, betrouwbare overdracht en WS-Addressing ondersteunt. WsDualHttp: gelijkaardig aan WsHttp maar ontworpen voor duplex contracts. WsDualHttp ondersteunt, in tegenstelling tot WsHttp enkel SOAP security. WsFederationHttp: biedt de mogelijkheid om identiteiten de delen/verspreiden over verschillende systemen. Deze identiteiten kunnen dan gebruikt worden voor authenticiteit en autorisatie. NetMSMQ: ondersteunt het gebruik van een wachtrij voor berichten. Wanneer men asynchroon berichten wenst uit te wisselen in WCF, is NetMSMQ enige mogelijkheid. Er is de mogelijkheid om security toe te passen op transport en bericht niveau. NetPeerTcp: wordt gebruik voor PeerChannel transport. Peer transport verstuurt berichten door gebruik te maken van verschillende tussenstations, peers genaamd. Ook hier is er de mogelijkheid om security toe te passen op transport en bericht niveau. Er is dus een hele ruime keuze aan standaard bindings. Dit maakt de keuze niet altijd even eenvoudig. Een geschikte binding selecteren kan via volgend beslissingsdiagram. 37

40 Windows Communication Foundation Neen WCF naar WCF Ja Neen MSMQ client Neen Op zelfde machine ASMX client Ja Onstabiele verbinding Ja Neen Ja Neen Ja WSHttp WsDualHttp WsFederationHttp NetTCP BasicHttp NetMSMQ NetMSMQ NetNamedPipe NetPeerTCP Figuur 9: Binding beslissingsdiagram Contract Een contract van een endpoint is een collectie van operaties die bescrhijven met wat de service communiceert met de buitenwereld. Iedere operatie is een beschrijving van de berichten uitwisseling, bvb. éénrichtingsverkeer of vraag/antwoord. Net zoals bij Binding zorgen Name en Namespace voor een unieke identificatie. Binnen ContractDescription heeft iedere operatie een corresponderende Operation-Description die de berichtwisseling zal beschrijven. Iedere OperationDescription bevat ook een collectie van MessageDescriptions. Deze bevatten een omschrijving van de berichten die uitgewisseld worden. Ieder contract kan ook een collectie van ContractBehaviors bevatten. Deze zorgen ervoor dat het gedrag van een service nog kan aangepast worden. Figuur 10: ContractDescription structuur Kort samengevat bevat een endpoint een uniek address, een binding en een contract. 38

41 Windows Communication Foundation Hoe een service klasse gecreëerd wordt, hebben we reeds besproken. Laten we nu even kijken hoe we één of meerdere endpoints creëren voor een service Endpoints in de praktijk In tegenstelling tot service- en datacontracts, worden endpoints niet gedefinieerd m.b.v. attributen binnen de service klasse. WCF voorziet twee mogelijkheden om endpoints te definieren: enerzijds kunnen ze in code gedefinieerd worden, anderzijds in een configuratie bestand. Definieren in code Wanneer een service wordt gehost in een ServiceHost object, dan kan men een endpoint toevoegen via de methode AddEndpoint van het ServiceHost object. Met deze methode moeten het contract, de binding en het address meegegeven worden als argumenten. ServiceHost RekenmachineService = new ServiceHost(typeof(RekenmachineService)); RekenmachineService.AddServiceEndpoint(typeof(HelloService), new BasicHttpBinding(), "http://localhost/rekenmachine"); Definieren in configuratie bestand Code Listing 6: Gebruik van ServiceHost Dit is de aangewezen manier om endpoints te definiëren. Als men bvb. het adres wenst te wijzigen en het endpoint is in code gedefinieerd, dan moet de code opnieuw compileerd worden. Met een configuratie bestand is dit niet het geval. Wanneer de service wordt gehost binnen een applicatie, kan het app.config bestand gebruikt worden. Bij het hosten binnen IIS of WAS is dit het web.config bestand. Opnieuw worden hier het address, de binding en het contract gedefinieerd. <system.servicemodel> <services> <service name="rekenmachine. RekenmachineService" behaviorconfiguration="myservicetypebehaviors"> <endpoint address="http://localhost/rekenmachine" binding="basichttpbinding" contract=" RekenmachineService. RekenmachineService " /> </service> </services> </system.servicemodel> Code Listing 7: Configuratie in web.config Host omgeving van een WCF service Zoals in Figuur 11 werd getoond, heeft een WCF service een host omgeving nodig om in te draaien. Er bestaan verschillende mogelijkheden om een WCF service te hosten. Hosten in een arbitrair proces Hosten in Managed Windows Service Hosten via IIS Hosten via Windows Activation Service (WAS) 39

42 Windows Communication Foundation Hosten in een arbitrair process Dit is de meest flexibele optie en is ook het eenvoudigst op te zetten. Deze methode wordt ook wel self-hosting genoemd omdat het proces van de service klasse zelf zorgt voor zijn hosting. Deze manier van hosting wordt vaak toegepast tijdens de ontwikkeling van een service. Zo kan men eenvoudig debuggen en kan je makkelijker nagaan wat er allemaal in de service gebeurt. Hoe dit precies in zijn werk gaat wordt aangetoond met een voorbeeld waarin de rekenmachine service wordt gehost binnen een console applicatie. ServiceHost is een klasse die WCF levert om services te hosten binnen een applicatie. Bij construcie wordt het type van de service meegegeven (in dit voorbeeld gaat het om de rekenmachine) en het adres van de service (het is ook mogelijk om meerdere adressen te gebruiken, hiervoor kan Uri tabel meegegevens worden). Met de methodes Open() en Close() kan de hostomgeving geactiveerd/gedeactiveerd worden. using System.ServiceModel; using RekenmachineService; namespace RekenmachineSelfHosting; class Program static void Main(string[] args) Uri baseuri = new Uri("http://localhost/rekenmachine"); ServiceHost r1 = new ServiceHost(typeof(Rekenmachine), baseuri); r1.open(); Console.WriteLine("Service draait. Druk ENTER om af te sluiten"); Console.ReadLine(); r1.close(); Code Listing 8: Hosten van een service in arbitrair proces Een service heeft één of meerdere endpoints. Deze worden hier in een configuratiebestand gedefinieerd. Hier worden twee endpoints gedefinieerd met als belangrijkste verschil, het contract. Via het endpoint RekenmachineHoger zullen alle vier basisbewerkingen mogelijk zijn, terwijl via endpoint RekenmachineLager enkel optellen en aftrekken mogelijk zal zijn. Het adres van beide endpoints is relatief aangezien in het codebestand hierboven, een baseuri is opgegeven voor de ServiceHost. Voor het endpoint RekenmachineHoger is het adres dus <?xml version="1.0" encoding="utf-8"?> <configuration> <system.servicemodel> <services> <service name="rekenmachineservice.rekenmachine" behaviorconfiguration="rekenmachinebehavior"> 40

43 Windows Communication Foundation <endpoint address="rekenmachinehoger" binding="basichttpbinding" contract="rekenmachineservice.irekenmachinehoger" /> <endpoint address="rekenmachinelager" binding="basichttpbinding" contract="rekenmachineservice.irekenmachinelager"/> </service> </services> <behaviors> <servicebehaviors> <behavior name="rekenmachinebehavior" > <servicemetadata httpgetenabled="true" /> <servicedebug includeexceptiondetailinfaults="true" /> </behavior> </servicebehaviors> </behaviors> </system.servicemodel> </configuration> Code Listing 9: Configuratie van endpoints Opm: in het configuratiebestand hierboven wordt gebruik gemaakt van een custom behavior: RekenmachineBehavior. Hierdoor wordt het mogelijk om de service te bekijken via een browser en zullen ook eventuele fouten worden afgebeeld. Wanneer we nu het adres van de service ingeven in een browser, krijgen we een pagina met informatie over hoe deze service nu kan gebruikt worden door een client. Plaatsen we?wsdl na het adres, dan wordt de inhoud van het WSDL document van de service afgebeeld. Figuur 11: Service browser informatie Figuur 12: Service WSDL code 41

44 Windows Communication Foundation Hosten in Managed Windows Service Hier zal de WCF service gehost worden binnen een Windows Service. Terwijl hosten in een arbitrair proces eerder bedoeld is voor testdoeleinden, is deze manier van hosten wel geschikt binnen een reële werkomgeving. Hier zijn diverse redenen voor: De levensduur van de service zal hier bepaald worden door het besturingssysteem. Bij een fout kan een service automatisch heropgestart worden. Windows biedt een grafische interface waar een administrator de services van het systeem kan beheren. Fouten die optreden binnen een service worden opgeslagen in een log bestand. Hoe dit precies in zijn werk gaat wordt opnieuw uitgelegd met behulp van de rekenmachine service. Creatie Windows Service project De eerste stap is de creatie van een nieuw Windows Service project. Dit kan in verschillende talen (in dit voorbeeld C#). Dergelijk project bevat: Service implementatie van een service contract Configuratiebestand Windows service klasse Installer klasse De service implementatie van een service contract: een klasse die een service contract implementeerd. In dit voorbeeld is dit de rekenmachine klasse die reeds besproken werd (zie Code Listing 1) Configuratiebestand: hierin worden de endpoints gedefinieerd. In dit voorbeeld is het configuratie bestand hetzelfde als bij het hosten in een arbitrair proces (Code Listing 9). Windows Service klasse: een klasse die overerft van de ServiceBase klasse en de methodes OnStart en OnStop implementeert. Bij creatie van een Windows Service project is er standaard een template klasse aanwezig die aangepast kan worden. De Windows Service klasse voor de rekenmachineservice ziet er als volgt uit: Bij constructie worden een aantal eigenschappen van de Windows Service ingesteld: naam van de service, automatisch loggen, start/stop mogelijkheden, public partial class Service1 : ServiceBase ServiceHost host; public Service1() this.servicename = "RekenmachineService"; this.autolog = true; this.canpauseandcontinue = false; 42

45 Windows Communication Foundation this.canshutdown = false; this.canstop = true; Code Listing 10: Service hosten in Windows Services - Constructor OnStart wordt uitgevoerd wanneer de service gestart wordt. Hier gaan we opnieuw gebruik maken van de ServiceHost klasse. Deze wordt hier geïnitialiseerd en er wordt een eventhandler aan toegevoegd zodat we fouten kunnen opvangen. Er wordt ook een bericht in het logbestand geschreven om aan te duiden dat de service is gestart. protected override void OnStart(string[] args) host = new ServiceHost(typeof(Rekenmachine)); host.faulted += new EventHandler(Fout_bij_host); host.open(); this.eventlog.writeentry("rekenmachineservice is klaar voor gebruik.", EventLogEntryType.FailureAudit, 0, 0); Code Listing 11: Service hosten in Windows Services Starten van service OnStop wordt uitgevoerd wanneer de service gestopt wordt. Hierbij wordt de hostomgeving gesloten en wordt opnieuw een bericht in het logbestand geschreven. protected override void OnStop() try if (host!= null) host.close(); this.eventlog.writeentry("rekenmachineservice is gesloten.", EventLogEntryType.Information, 0, 0); catch this.eventlog.writeentry("fout bij het afsluiten van Rekemachineservice.", EventLogEntryType.Error, 0, 0); finally host = null; Code Listing 12: Service hosten in Windows Services Stoppen van service Wanneer er binnen de service een fout optreedt, wordt een foutboodschap naar het logbestand geschreven. 43

46 Windows Communication Foundation void Fout_bij_host(object sender, EventArgs e) this.eventlog.writeentry("er is een fout opgetreden bij Rekemachineservice.",EventLogEntryType.Error, 0, 0); Code Listing 13: Service hosten in Windows Services - Logging Installer klasse: een klasse die erft van System.Configuration.Installer is nodig om deze service te installeren als Windows Service met behulp van de utility Installutil.exe. Hieronder wordt de code afgebeeld om onze rekenmachine-service te installeren als een Windows Service. Hierin kunnen eigenschappen van de service ingesteld worden zoals opstarttype, beschrijving, schermnaam,. [RunInstaller(true)] public class WindowsServiceInstaller : Installer public WindowsServiceInstaller() ServiceProcessInstaller processinstaller = new ServiceProcessInstaller(); ServiceInstaller serviceinstaller = new ServiceInstaller(); processinstaller.account = ServiceAccount.NetworkService; serviceinstaller.displayname = "RekenmachineService"; serviceinstaller.description = "WCF service host voor RekenmachineService"; serviceinstaller.servicename = "RekenmachineService"; serviceinstaller.starttype = ServiceStartMode.Automatic; Installers.Add(processInstaller); Installers.Add(serviceInstaller); Code Listing 14: Service hosten in Windows Services Installer klasse Installeren van de service ( Hosten in Managed Windows Service) Het installeren gebeurt met het commando installutil.exe in command prompt. Als parameter geven we de naam op van het.exe bestand van het Windows Service project. installutil.exe RekenmachineHostService.exe Microsoft (R).NET Framework Installation utility Version Copyright (c) Microsoft Corporation. All rights reserved. Running a transacted installation. Beginning the Install phase of the installation. The Commit phase completed successfully. The transacted install has completed. 44

47 Windows Communication Foundation Wanneer we nu gaan kijken naar het Services venster, zien we dat de RekenmachineService is opgenomen in de lijst. Wanneer de service gestart is, kunnen clients gebruik maken van de service. Figuur 13: Windows Services: RekenmachineService Men kan het opstarttype danig instellen dat de service automatisch gestart wordt als de server gestart wordt of dat de service manueel gestart/gestopt kan worden. Tijdens de werking van de service zullen berichten geschreven worden naar een logbestand. Dit is bestand kan men bekijken via Systeembeheer>Logboeken>Toepassing. Figuur 14: Logberichten bekijken Hosten via IIS Wanneer WCF-services over het internet beschikbaar worden gesteld via het http protocol, biedt IIS de beste oplossing. IIS is schaalbaar, betrouwbaar en fouttolerant, wat in een webomgeving erg belangrijk is. 45

48 Windows Communication Foundation Om de rekenmachine-service te hosten in IIS moeten twee bestanden worden toegevoegd aan het rekenmachine-project:.svc bestand Configuratiebestand.svc bestand: vertelt aan IIS dat het om een WCF-service gaat. De inhoud van dit bestand bestaat uit één regel: Service="RekenmachineService.Rekenmachine" %> Code Listing richtlijn richtlijn vertelt IIS welke klasse de service voorstelt (in dit geval de klasse Rekenmachine in de namespace RekenmachineService). Ze vertelt ook welke <service> sectie in het configuratiebestand, IIS moet aanspreken. Configuratiebestand: hierin worden de endpoints gedefinieerd. In dit voorbeeld is het configuratie bestand bijna hetzelfde als bij het hosten in een arbitrair proces. Er zit een klein verschil bij het adres van een endpoint. Wat men bij het address opgeeft is een relatief pad. Het adres waarmee de client dan een endpoint wenst aan te spreken is dan het adres van het svcbestand + het adres vermeldt bij de definitie van het endpoint. <endpoint address="hoger" contract="rekenmachineservice.irekenmachinehoger" binding="wshttpbinding"/> Code Listing 16: Configuratie van een endpoint Daarna wordt een nieuwe virtuele map aangemaakt in IIS die gelinkt wordt aan de map van het project. Stel dat we de virtuele map de naam Rekenmachine geven en de service informatie wordt opgeslagen in het bestand service.svc, dan is het adres van het endpoint met contract IRekenmachineHoger: Opnieuw kan nu het adres van de service (http://localhost/rekenmachine/service.svc) ingevuld worden in een browser waar men een pagina krijgt met informatie over de service. (zie ook Hosten in IIS) Gebruiken van een WCF Service Nu hebben we reeds gezien hoe we een WCF-service kunnen creëren en hoe we die kunnen hosten. Nu gaan we zien hoe een WCF-service gebruikt kan worden. Zoals reeds eerder besproken kan een WCF-service ook gebruikt worden door een client die niet in.net is ontwikkeld. Hier zullen we bespreken hoe een dergelijke verbuiker/client gecreëerd kan worden in.net en in Java Net client Om een.net client te creëren zijn er twee mogelijkheden. We kunnen enerzijds gebruik maken van de ServiceModel Metadata Utility Tool of we gebruiken de Add Service Reference in Visual Studio. 46

49 Windows Communication Foundation Via ServiceModel Metadata Utility Tool Deze tool wordt gebruikt om service model code te genereren op basis van metadata en om metadate te gaan genereren op basis van een service model. Om van deze tool gebruik te maken gebruikt men het svcutil.exe bestand dat meegeleverd wordt met het.net Framework 3.0. In de eerste stap gaan we service model code genereren op basis van metadata. Hiervoor geven we het volgende commando op: Svcutil.exe //out:client.cs /config:app.config Als eerste parameter word het adres van de service opgegeven. In dit geval is dit het adres van het.svc bestand omdat we de service die in IIS gehost is, gaan gebruiken. Daarna geven de bestandsnaam op van het code bestand dat gegenereerd zal worden en wordt ook gevraagd om een configuratie bestand aan te maken met de naam config.app. Figuur 15: Service Model Metadata Utility Tool Dan maken we een nieuw project aan in Visual Studio en voegen we de twee gecreëerde files toe. Wanneer dit gebeurt is kunnen we op een eenvoudige manier gebruik maken van de service: RekenmachineLagerClient rlc = new RekenmachineLagerClient(); RekenmachineHogerClient rhc = new RekenmachineHogerClient("EndpointHoger"); int resultaat1 = rlc.optellerlager(5, 7); int resultaat2 = rhc.vermenigvuldighoger(5, 7); Code Listing 17: Gebruik van een service Voor de duidelijkheid zien we hier nog even de definitie van een endpoint in het configuratie bestand van de service: <endpoint name="endpointhoger" address="rekenmachinehoger" binding="basichttpbinding" contract="rekenmachineservice.irekenmachinehog/> Code Listing 18: Configuratie van een endpoint Om gebruik te maken van de functies/methodes van een endpoint wordt eerst een endpointclient-klasse aangemaakt. De naam van deze klasse is het adres van het endpoint + Client. Bij de constructie ervan kan ook de naam van het endpoint meegegeven worden. 47

50 Windows Communication Foundation Via deze clients kunnen we dan gebruik maken van de diensten die de service aanbiedt. In dit voorbeeld kunnen we dus rekenkundige bewerkingen uitvoeren Via Add Service Reference Svcutil werd vooral gebruikt in beta versies van het.net Framework 3.0. Wanneer men gebruikt maakt van de definitieve versie kan men gebruiken maken van de optie Add Service Reference. Hiervoor klikken we met de rechtermuisknop op het Visual Studio project en klikken we op Add Service Reference. Figuur 16: Visual Studio: Add Service Reference Dan krijgen we een venster te zien waar we het adres van de service moeten ingeven. Indien we hier het adres ingeven van de service gehost in IIS, krijgen we opnieuw het webpagina te zien met meer info over de service. Klikken we op de knop Add Reference worden de bestanden die nodig zijn om van de service gebruik te maken, gecreëerd en toegevoegd aan het project. 48

51 Windows Communication Foundation Figuur 17: Opgeven van het adres van de service Dan kunnen we op een gelijkaardige manier als bij het gebruik van svcutil, gebruik maken van de service: RekenmachineHogerClient rhc = new RekenmachineHogerClient("EndpointHoger"); int resultaat = rhc.optellenhoger(5, 7); Code Listing 19: Gebruik van een service Java client Een van de troeven van WCF is de comptabiliteit met andere platformen. Hier gaan we een Java client creëren die gebruik zal maken van de Rekenmachine service. Apache heeft een webservices-toolkit ontwikkeld voor Java ontwikkelaars, Axis genaamd. Deze software en veel informatie hierover kan men terug op ws.apache.org/axis. Wanneer deze software geïnstalleerd is kan men codebestanden genereren die toegang bieden tot de service. De bestanden worden gecreëerd met volgend commando: java org.apache.axis.wsdl.wsdl2java -v -o c:\meta Figuur 18: Genereren van codebestanden Met behulp van het java commando spreken we WSDL2Java aan. Zoals de naam doet vermoeden zet deze WSDL om in Java documenten. De optie v staat voor verbose mode, met o kan men het outputpad bepalen en als laatste parameter wordt het adres van de wsdl documentatie opgegeven. 49

52 Windows Communication Foundation De gecreëerde bestanden kunnen we nu in een Java programma gebruiken om de service te gebruiken: import java.math.*; import org.tempuri.irekenmachinehoger; import org.tempuri.rekenmachinelocator; public class Main public static void main(string[] args) try RekenmachineLocator locator= new RekenmachineLocator(); IRekenmachineHoger rm=locator.getbasichttpbinding_irekenmachinehoger(); int waarde=rm.optellenhoger(10,11); System.out.println("De som van 10 en 11 is: " + waarde); catch(exception e) Code Listing 20: Gebruik van service in Java Op deze manier kan men op een eenvoudige manier ook gebruik maken van WCF-services in Java. Figuur 19: Gebruik van service met Java 50

53 Windows Communication Foundation 1.5. Problemen Definiëren van service contracts: Situering: Voor een service worden twee service contracts gedefinieerd door gebruik te maken van interfaces. Hiervoor wordt volgende code gebruikt: namespace RekenmachineService [ServiceContract] public interface IRekenmachineHoger [OperationContract] int Optellen(int a, int b); [OperationContract] int Aftrekken(int a, int b); [OperationContract] int Vermenigvuldig(int a, int b); [OperationContract] int Delen(int a, int b); [ServiceContract] public interface IRekenmachineLager [OperationContract] int Optellen(int a, int b); [OperationContract] int Aftrekken(int a, int b); Code Listing 21: Service met twee interfaces Wanneer we bij een client echter een referentie naar de service wensen toe te voegen, krijgen we volgende fout: An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior contract: ----> System.InvalidOperationException: The RekenmachineService.IRekenmachineLager.Optellen operation references a message element [http://tempuri.org/:optellen] that has already been exported from the RekenmachineService.IRekenmachineHoger.Optellen operation. You can change the name of one of the operations by changing the method name or using the Name property of OperationContractAttribute. Alternatively, you can control the element name in greater detail using the MessageContract programming model. at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isoperationcontextset) 51

54 Windows Communication Foundation Probleem: voor het exporteren van de service contracts wordt WSDL gebruikt. De host applicatie genereert automatisch een WSDL contract en gebruikt in zijn structuur de naam van het operation contract. Standaard wordt de naam van de methode gebruikt. In dit voorbeeld zijn er dus twee operation contracts met dezelfde naam (Optellen en Aftrekken). Dit heeft tot gevolg dat er in het WSDL contract, twee elementen zullen zijn met dezelfde naam en binnen WSDL moeten alle elementen een unieke naam hebben. Oplossing: Aan ieder operation contract een unieke naam geven. Dit doen we met de Name eigenschap: [OperationContract(Name="OptellerLager")] int Optellen(int a, int b); Code Listing 22: Naam geven aan een operation contract Hosten in Managed Windows Service Situering: Na de installatie van de Windows Service wordt bij het starten, de Windows Service onmiddellijk weer afgesloten. Wanneer we in het logbestand kijken zien we volgende foutmelding: Figuur 20: Foutmelding in logboek Probleem: het proces dat onze service doet draaien heeft niet genoeg rechten om het adres van de WCF-service te registreren (http://localhost:8000/rekenmachine). 52

55 Windows Communication Foundation Oplossing: met Httpcfg.exe kunnen we bepaalde adressen reserveren en de toegang controleren via een access control list. Met het commando httpcfg.exe query urlacl krijgen we een lijst van alle reserveringen en ACL s. Deze ACL s worden weergegeven als SDDL strings. C:\>httpcfg.exe query urlacl URL : ACL : D:(A;;GX;;;LS) URL : ACL : D:(A;;GX;;;WD) Nu moet het adres voor onze rekenmachine hieraan toegevoegd worden. De ACL moet in dit geval de user NETWERKSERVICE bevatten (bij het opstarten van de service zal deze account gebruikt worden). Op die manier zal het proces het adres van de service kunnen registreren. Om de omzetting te doen van NETWERKSERVICE naar de overeenkomstige SDDL string (=D:(A;;GX;;;NS)), bestaan verscheidene tooltjes. We voeren volgend commando uit: httpcfg.exe set urlacl /u /a D:(A;;GX;;;NS) Nu kan het proces registreren en kan de service normaal gestart worden Hosten in IIS Situering: Er is een svc-bestand aangemaakt zodat de WCF-service gehost wordt in IIS. Wanneer we echter het adres van de service invoeren in een browser, krijgen we de inhoud te zien van het svc-bestand maar geen info over de service. Probleem: IIS weet niet wat hij met de extensie.svc moet aanvangen. De ondersteunde extensies kunnen bekeken worden door naar de eigenschappen van de standaard website te gaan en daar in het tabblad Basismap op de knop configuratie te klikken. 53

56 Windows Communication Foundation Figuur 21: Configuratie standaard website Figuur 22: Toevoegen van.svc extensie. In dit overzicht zien we dat.svc niet aanwezig is. Normaal gezien verwacht men dat men via de knop Toevoegen hier een extensie kan aan toevoegen maar wanneer men dit probeert blijft knop disabled (ook wanneer ingelogd is als administrator). Dit blijkt een bug te zijn in IIS 5.1. Oplossing: Er bestaat nog een andere manier om een extensie toe te voegen aan deze lijst en dat is door gebruik te maken van de Metabase Explorer. Dit is een tool die deel uit maakt van de IIS Resource Kit Tools. Deze kit is gratis te download op de site van Microsoft. Figuur 23: Metabase Explorer Figuur 24: ScriptMaps Properties Window 54

57 Windows Communication Foundation Wanneer we de Metabase Explorer openen gaan we naar W3SVC in de tak LM. In de lijst dubbelklikken we op ScriptMaps. Dan krijgen we een lijst met extensies. Hieraan moet.svc worden toegevoegd. Onderaan de lijst kunnen we via <new item> een extensie toevoegen en we vullen volgende waarde in:.svc,c:\windows\microsoft.net\framework\v \aspnet_isapi.dll,1,get,head,post,de BUG De eerste term is de extensie, gevolgd door het bestand dat nodig is om bestanden met een dergelijke extensie te verwerken, gevolgd door de toegelaten operaties. Daarna voegen we dezelfde waarde toe aan Scriptmaps in het ROOT element (W3SVC > 1 > ROOT). Wanneer we nu nogmaals naar de configuratie van de standaard website gaan kijken, zien we dat de extensie.svc is toegevoegd aan de lijst en op die manier kan IIS svc-bestanden verwerken. Wanneer we nu nogmaals het adres van de service invoeren in een browser, krijgen we informatie over de service. 55

58 Windows Communication Foundation Axis Situering: Met het Java commando willen we gebruik maken van Axis om op basis van WSDL, Java klassen te genereren. Probleem: Wanneer we via het java commando, axis willen aanspreken, krijgen we een NoClassDefFoundError fout. Figuur 25: Axis foutmelding Oplossing: De gedownloade Axis bestanden (http:// ws.apache.org/axis), bevatten enkele JAR bestanden/library s. Deze moeten toegevoegd worden aan het classpath. Deze variabele kan men instellen via Configuratiescherm>Systeem. In het tabblad Advanced klikken we op de knop Omgevingsvariabelen. Hier kan de variabele classpath aangemaakt of gewijzigd worden. We kunnen nu het classpath uitbreiden met de map waar de Axis (.jar) bestanden opgeslagen zijn of we kunnen deze bestanden plaatsen in een map die reeds in het classpath vermeld staat. Figuur 26: Aanpassen classpath Wanneer de Axis bestanden zijn opgenomen in het classpath, kunnen we zonder problemen gebruik maken van Axis. 56

59 Windows Communication Foundation 1.6. Besluit Met WCF beschikt een ontwikkelaar over een framework dat uitermate geschikt is om service georiënteerd te gaan werken en dat in een vertrouwde omgeving. Er waren reeds verschillende technologieën waarmee men service georiënteerd kan gaan ontwikkelen. Een nadeel hierbij is dat elke van deze technologieën zijn beperkingen heeft. Kortom er moest een keuze gemaakt worden. Die keuze hoeft men met WCF niet te maken. Verder zorgt de ondersteuning van de WS-* specificaties voor heel wat mogelijkheden op gebied van beveiliging en betrouwbaarheid. Bijkomend voordeel is dat het gebruik WCF zich niet beperkt tot het Microsoft platform maar ook ondersteuning biedt naar andere platformen. Voor een ontwikkelaar is WCF relatief eenvoudig. Zoals werd gezien kan men eenvoudig een WCF-service creëren, hosten en gebruiken. Let wel op, in deze voorbeelden beperkten we ons tot applicaties met een niet al te uitgebreide configuratie. In het configureren van zo een service kan men heel ver gaan op het gebied van betrouwbaarheid en beveiliging. Door de beperkte tijd beperkten we ons hier tot de basis. Van vertragingen is er bij eenvoudige applicaties zoals deze die we hier gemaakt hebben, weinig sprake. Toch leerden we uit gesprekken met mensen die WCF reeds toepasten in grotere projecten, dat er toch wel een merkbare vertraging aanwezig is in vergelijking met reeds bestaande technologieën. In de toekomst zal de performantie stijging van de machines deze vertraging normaal gezien teniet doen. 57

60 Windows Workflow Foundation Hoofdstuk 2 Windows Workflow Foundation 2.1. Workflow Voor we dieper ingaan op de Workflow Foundation is het belangrijk dat we eerst definiëren wat workflows zijn want de term workflow wordt in zeer uiteenlopende gebieden gebruikt. De basis van een workflow is een opdracht die uit één of meerdere acties bestaat. Hierin vinden we dus het work gedeelte terug. Daarnaast hebben we de flow, welke de beschrijving is van de opeenvolging van die acties. Deze beschrijving bestaat uit een aantal keuzes die gemaakt worden tijdens de uitvoering van de workflow of een aantal regels waaraan het proces moet voldoen. Bij het uitvoeren van een workflow kunnen we dan ook zeggen dat deze zich in een toestand bevindt, afhankelijk van welke acties reeds uitgevoerd zijn. Een lopende workflow zal dan ook na elke uitgevoerde actie overgaan naar een nieuwe toestand, tot een eindtoestand bereikt is. Op zich is een workflow dus een concept dat los staat van softwareontwikkeling, de meeste handelingen die we gedurende een dag uitvoeren zijn namelijk ook eenvoudige vormen van workflows. Ook is het belangrijk dat we deze workflows op verschillende niveaus kunnen bekijken. Als we een workflow op een hoger abstractieniveau bekijken, dan kan blijken dat deze op zich een actie is in een hoger liggende workflow. Workflows zijn echter niets nieuws in softwareontwikkeling. De beschrijving die hierboven staat komt namelijk heel goed overeen met hoe we flowcharts kunnen definiëren. Flowcharts worden in het onderwijs al lang gebruikt als eerste kennismaking met het opstellen van programmalogica. De eenvoudige grafische structuren laten toe om snel de verschillende acties en beslissingen weer te geven die voorkomen bij de uitvoering van een programma. Deze flowcharts worden echter enkel als documentatie gezien en worden meestal in het begin van een softwareproject opgesteld en daarna vergeten. Het model dat werd opgesteld is dan ook niet rechtstreeks terug te vinden in de ontwikkelde software. Een belangrijke reden hiervoor is dat het ten tijde van de ontwikkeling van flowcharts niet mogelijk was om deze in software voor te stellen, dit zou teveel kosten in CPU tijd. Dit heeft een aantal nadelen: Code is moeilijker leesbaar dan een schema. Hoe goed de code ook gedocumenteerd of gecommentarieerd is, de structuur is soms moeilijk terug te vinden. Er is dan ook een groot risico dat de echte werking van het programma enkel door de ontwikkelaars gekend is. Wanneer andere ontwikkelaars verder moeten werken aan deze code kan dit dus moeilijkheden geven. Indien het flowchart model dat oorspronkelijk opgesteld werd 58

61 Windows Workflow Foundation echter aangepast wordt bij het coderen en te volgen is bij de uitvoering van het programma zou dit het verloop van het programma sterk kunnen verduidelijken. Na het compileren en uitvoeren van code wordt deze zo goed als onleesbaar. Alle statements zijn omgezet in operaties die de hardware kan begrijpen of die kunnen uitgevoerd worden door een virtuele machine. Dit is natuurlijk goed om de programmalogica te beschermen tegen het kopiëren ervan maar dit maakt een aantal zaken ook complexer. Hoe groter de programma s worden, hoe moeilijker het dus wordt om fouten in de uitvoering ervan op te sporen. Opnieuw kan dit vermeden worden als het flowchart model beschikbaar zou zijn bij het uitvoeren van de software. Bij het schrijven van objectgeoriënteerde code wordt volop gebruik gemaakt van methodes en objecten. Dit zorgt ervoor dat de software opgesplitst wordt in kleinere logische eenheden wat de onderhoudbaarheid sterk verhoogt. Dit creëert echter een nieuwe uitdaging, namelijk het doorgeven van data tussen verschillende onderdelen. Zelfs de simpele flowchart modellen hebben echter de mogelijkheid om een gedeelde status voor te stellen, waarbij een variabele in de eerste stap van de workflow gecreëerd wordt en vervolgens beschikbaar is in de rest van de workflow. De voorbije jaren is de nood aan workflows sterk gestegen, binnen softwareontwikkeling maar vooral ook daarbuiten, en is CPU tijd een stuk goedkoper geworden. Met probeert dan ook meer en meer deze workflows in software op te nemen. Als we echter kijken naar de hedendaagse software dan merken we dat deze in veel gevallen event-driven is, dus gestuurd door gebeurtenissen. Het verloop is dus afhankelijk van een aantal gebeurtenissen tijdens het uitvoeren van het programma. Hier zien we meteen één van de beperkingen van flowcharts, zo een gedrag kunnen we namelijk niet weergeven met dit model. Hiervoor werd het concept van state machines ontwikkeld. Hierbij bestaat de workflow ook uit een aantal toestanden, de overgang wordt echter niet bepaald door een vooraf gedefinieerde flow maar door de gebeurtenissen die zich voordoen tijdens het uitvoeren van het programma. Deze state machines zijn tot nu toe ook niet terug te vinden bij het coderen van deze programma s wat het eveneens moeilijk maakt om deze achteraf te kunnen begrijpen, net zoals bij de flowcharts. Voor zowel de sequentiële workflows als voor de state machines zou het dus zeer nuttig zijn als het model dat oorspronkelijk gebruikt werd om het gedrag ervan te beschrijven aanwezig zou blijven in de software en dus kan bekeken worden bij de uitvoering ervan. 59

62 Windows Workflow Foundation 2.2. Workflows in software Nu we de betekenis van een workflow gedefinieerd hebben kunnen we gaan kijken waar we deze in software kunnen gebruiken. Dit zal enerzijds het nut van deze nieuwe technologie aantonen en anderzijds een aantal van de vereisten ervan weergeven. Een aantal scenario s die kunnen uitgewerkt worden aan de hand van workflows: Modelleren van bedrijfsprocessen: In de bedrijfswereld wordt er veel gebruik gemaakt van bedrijfsprocessen die vastleggen hoe er tewerk gegaan wordt. Het is dan ook een uitdaging voor softwareontwikkelaars om deze zo goed mogelijk voor te stellen in de programma s die deze processen ondersteunen. De trend is namelijk dat men de gehele werking van een bedrijf zoveel mogelijk wil vatten in deze bedrijfsprocessen. Het is dan ook nodig dat de software deze getrouw voorstelt maar tegelijk ook snel en eenvoudig kan aangepast worden aan de voortdurend veranderende noden van een bedrijf. Tot nu toe hebben de verschillende leveranciers van procesondersteunende software zelf een workflow systeem gemaakt. Het komt echter veel voor dat systemen van verschillende leveranciers binnen een bedrijf moeten samenwerken, wat natuurlijk niet eenvoudig is. Hier is er dus een nood aan een uniforme voorstelling van een workflow welke dan kan gebruikt worden door de verschillende ontwikkelaars om zo hun systemen beter te integreren. Beheren van de levensweg van documenten: Tot nu toe is er geen vaste manier om het tot stand komen van een bepaald document te bepalen. Voor versiebeheer zijn er reeds een aantal systemen gerealiseerd maar de samenwerking tussen verschillende gebruikers is hiermee niet vastgelegd. In de toekomst zal het echter steeds belangrijker worden om deze samenwerking vooraf vast te leggen en deze later eenvoudig te kunnen raadplegen. In eerste instantie is dit een gevolg van de Sarbanes-Oxley wet die de informatiestroom en rapportering binnen een bedrijf een aantal regels oplegt. Daarnaast willen ook meer en meer bedrijven af van de papieren versies van een aantal processen. Voor al deze zaken kan een workflow goed gebruikt worden. Deze zal registreren wie er aan een document gewerkt heeft en hierin zelfs een bepaalde structuur en volgorde vastleggen. Opstellen van de paginaovergang van grafische user interfaces: Bij het ontwerpen van de interface van een applicatie is navigatie tussen de verschillende onderdelen ervan een belangrijk aspect. Bij de uitwerking ervan zien we veelal dat de logica voor de overgangen tussen verschillende pagina s vervat zit in de user interface. Dit maakt het hergebruik van deze componenten echter zeer moeilijk en levert een weinig flexibele interface op. Een belangrijke evolutie hierin is de introductie van het model view - controller principe dat de overgang van pagina s overlaat aan een apart onderdeel van de applicatie, de controller. Een workflow kan de rol van deze controller vervullen en zo de navigatie van een applicatie verzorgen. 60

63 Windows Workflow Foundation Met het gebruik van workflows in de voorgaande situaties zouden ontwikkelaars over een aantal nieuwe mogelijkheden beschikken. Het zou namelijk mogelijk zijn om bedrijfsprocessen op een getrouwe manier voor te stellen in de software die ze moet ondersteuren. Daarnaast kan een workflow voor een grotere flexibiliteit zorgen tussen verschillende onderdelen van een applicatie, wat natuurlijk een goede zaak is voor het hergebruik van die componenten. Als laatste zal het gebruiken van workflows in veel situaties leiden tot de snellere ontwikkeling van systemen door het vereenvoudigen van de overgang tussen de realiteit en de voorstelling ervan in de software Workflow Foundation Windows Workflow Foundation is Microsofts antwoord op een aantal van de hiervoor genoemde uitdagingen. Als deel van het nieuwe.net Framework 3.0 zal het een fundamenteel onderdeel worden van het Windows platform voor ontwikkelaars. Met WF wil Microsoft een framework aanbieden waarin iedere ontwikkelaar workflows kan ontwerpen en gebruiken volgens zijn behoeften Basisprincipes Er zijn een aantal principes die voortkomen uit het proces van software ontwikkeling die natuurlijk ook binnen WF gerespecteerd moeten worden. We zullen dan ook nagaan hoe deze mogelijkheden gerealiseerd worden. Een aantal van de belangrijke vereisten zijn: De workflow zal veelal een bedrijfsproces voorstellen. Het moet dus mogelijk zijn om beslissingen te nemen op basis van een verzameling regels, zowel eenvoudige als complexe. Deze regels zullen dan ook de voortgang binnen de workflow bepalen. Het is ook nodig dat de workflow gebruik kan maken van externe systemen. We zien namelijk meer en meer dat er gebruik gemaakt wordt van Web services, het is dan ook logisch dat de workflows deze ook moeten ondersteunen. Naast het voorstellen van een bedrijfsproces moet een workflow ook de invoer van gebruikers kunnen verwerken. Als laatste is het ook belangrijk dat de workflow blijft bestaan, ook al gebeurt er gedurende enkele weken niets. Er is dus ook een mogelijkheid nodig om deze te deactiveren en ergens op te slaan op een persistent medium, waarvan de workflow na enige tijd kan hervat worden. 61

64 Windows Workflow Foundation De voorgaande vereisten zijn eigenlijk toepasbaar op elke implementatie van een workflow. WF is echter een framework dus kan dit veel meer aanbieden: Het opbouwen van workflows uit componenten. Op deze manier is het mogelijk om verschillende componenten te creëren en deze dan samen te gebruiken in een workflow. Het framework moet er dan voor zorgen dat op een eenvoudige manier kan aangegeven worden hoe deze componenten moeten samenwerken, liefst zonder daar extra code voor te schrijven. Een grafische manier om workflows te definiëren. Aangezien een workflow nauw verwant is met een flowchart zou het interessant zijn om deze ook zo te kunnen voorstellen. Een workflow designer kan er dan ook voor zorgen dat de verschillende componenten van een workflow en de relaties ertussen grafisch kunnen weergegeven worden. Het opvolgen van een workflow. Het is zeker interessant om tijdens de uitvoering van een workflow te kunnen volgen in welke toestand die zich bevindt en wat reeds gerealiseerd is. Het wijzigen van een workflow. Het kan namelijk nodig zijn om tijdens het uitvoeren van een workflow een aantal wijzigingen aan te brengen in de manier waarop de verdere afhandeling zal gebeuren. Het kan bijvoorbeeld handig zijn om nog een stap toe te kunnen voegen aan de workflow terwijl deze al gestart is. Dit komt natuurlijk het meest voor van zodra er interactie is met gebruikers. De voorgaande principes zijn echter niets nieuws. De bestaande implementaties van workflowsystemen hebben elk een uitwerking voor de meeste van deze vereisten. Een echt succes zijn deze echter nooit geworden door de grote verscheidenheid tussen de verschillende implementaties. Microsoft hoopt hierin verandering te brengen door een uniform systeem dat door iedereen te gebruiken is. Het is dan ook de bedoeling om een flexibel framework te realiseren, zodat ontwikkelaars het systeem naar hun hand kunnen zetten om er zo het meeste uit te halen Doel Bij het realiseren van een workflow framework zijn er een aantal doelen die zeker moeten behaald worden om tot een goed resultaat te komen. De belangrijkste daarvan bespreken we nu kort. Een eerste belangrijke doelstelling is het creëren van een workflow technologie die op het Windows platform door alle programma s kan gebruikt worden. Het heeft namelijk geen zin om voor verschillende stukken software een workflowtechnologie te ontwikkelen, dit zou alleen maar extra problemen geven bij het laten samenwerken van die verschillende programma s. We zien nu al dat workflows geïntegreerd zijn in de Microsoft BizTalk Server, Microsoft Exchange Server en andere applicaties. Het is dan ook de bedoeling om van het workflowframework een essentieel onderdeel te maken van het Windows platform. 62

65 Windows Workflow Foundation Door WF een onderdeel te maken van.net 3.0 is het beschikbaar voor elke Windows applicatie die deze technologie nodig heeft. Het is dan ook Microsofts bedoeling dat WF de enige gebruikte workflowimplementatie zal worden op het Windows platform. Ze zorgen hier zelf gedeeltelijk voor door WF te gebruiken in de laatste versie van Microsoft SharePoint Services, die nu als Microsoft Office SharePoint Services (MOSS 2007) door het leven gaat, en Microsoft Office. Daarnaast zullen de bestaande workflowsystemen binnen BizTalk Server en Microsoft Dynamics in de volgende versies vervangen worden door WF. Dit zal er voor zorgen dat al deze applicaties het eenvoudiger maken om bedrijfsprocessen te implementeren doordat ze op eenzelfde workflowimplementatie bouwen. Het is wel belangrijk om op te merken dat WF bedoeld is voor ontwikkelaars en niet voor eindgebruikers. Er zijn namelijk geen voorzieningen voor het gebruik van workflows door gebruikers. Deze functionaliteit zal wel beschikbaar zijn binnen een aantal applicaties zoals Office en SharePoint maar dan binnen de grenzen van die applicaties. Ook het beheer van de workflows is niet volledig geïmplementeerd. De mogelijkheden zijn wel beschikbaar en kunnen eenvoudig door ontwikkelaars omgezet worden in een applicatie. Om ervoor te zorgen dat een zo breed mogelijk publiek bereikt wordt met WF is ervoor gekozen om het framework niet afhankelijk te maken van een taal of een ontwikkelapplicatie. Het framework heeft een standaardimplementatie van een aantal basisonderdelen maar een ontwikkelaar is volledig vrij om deze te gebruiken, aan te passen of volledig te herschrijven. Daarnaast is er een grafische designer voorzien die niet alleen beschikbaar is in Visual Studio maar ook in andere applicaties kan gehost worden. Natuurlijk moet de workflow in een applicatie gehost worden en ook hier krijgt de ontwikkelaar de volledige vrijheid. Zo goed als elk Windows proces kan gebruikt worden om een workflow in te hosten, van een simpele console applicatie tot een web service. In de reeds bestaande implementaties van workflows werd er de opsplitsing gemaakt tussen workflows binnen software en workflows waar gebruikersinteractie in voorkomt. WF wil deze twee soorten workflows op eenzelfde manier behandelen zonder de specifieke mogelijkheden ervan te verwaarlozen. Dit creëert natuurlijk de nood aan flexibiliteit en foutbestendigheid. Het moet ook mogelijk zijn om op een event-driven manier te werk te gaan die minder gestructureerd is dan een workflow in software. Daarnaast moet de data binnen de workflow ook op een gebruikersvriendelijke manier voorgesteld kunnen worden. Om een framework te creëren die beantwoordt aan al deze vereisten is dus een goed gestructureerde en flexibele technologie nodig. Hoe dit gerealiseerd is in WF bekijken we in de het volgende onderdeel. 63

66 Windows Workflow Foundation Uitwerking Nu we weten wat er van het platform verwacht wordt en welke doelen Microsoft voorop gesteld heeft kunnen we kijken hoe ze deze gerealiseerd hebben. In de implementatie van WF zien we duidelijk drie lagen (Figuur 27: Overzicht Windows Workflow Foundation): Workflow Model: Dit is de bovenste laag die de workflows verzorgt, hier zullen ontwikkelaars hun applicaties definiëren. Hier zijn dus de verschillende API s aanwezig om workflows te creëren. Runtime: Deze laag zorgt voor de uitvoering van de workflows die met het workflow model gecreëerd zijn. Hosting: Aangezien WF geen vast proces heeft moet het gehost worden in een andere applicatie. Deze laag zorgt ervoor dat workflows kunnen draaien binnen een host proces. Deze host verzorgt ook een aantal services die dan door de workflow zullen gebruikt worden. Figuur 27: Overzicht Windows Workflow Foundation 64

67 Windows Workflow Foundation Op elk van deze onderdelen gaan we nu iets dieper in Workflow Model De bovenste laag, het workflow model, is waar ontwikkelaars het meest zullen in werken bij het ontwikkelen van nieuwe applicaties. Het is namelijk hier dat de workflows gedefinieerd worden. Eerst en vooral moeten we een opsplitsing maken tussen de types workflows die WF ondersteunt: Sequentiële workflows: Dit is de workflowversie van de reeds gekende flowcharts. Hierin worden een aantal acties uitgevoerd volgens de weg die werd vastgelegd tijdens het ontwikkelen van de workflow. Deze workflows vinden we meestal terug tussen twee systemen. Ze hebben geen interactie nodig met gebruikers, zijn zeer voorspelbaar in hun uitvoer en zijn veelal ook letterlijk sequentieel van aard. State machine workflows: Deze workflows maken het mogelijk om een event-driven systeem op te bouwen. De workflow is opgebouwd uit een aantal toestanden en de overgangen tussen deze toestanden. Het is dus vooraf niet te bepalen hoe de applicatie zal uitvoeren aangezien ze geen sequentiële structuur heeft, de overgangen gebeuren als reactie op gebeurtenissen. State machine workflows zijn ideaal om systemen te ontwikkelen waar gebruikersinteractie nodig is of waar de workflow niet eenvoudig weer te geven is als een flow van acties. Hoewel deze twee types workflows erg verschillend zijn, worden ze binnen WF wel op gelijkaardige manier gemaakt. Het basisonderdeel van beide types is namelijk een activiteit. Elke workflow is opgebouwd uit een aantal van die activiteiten en de relaties ertussen. Binnen deze activiteiten hebben we twee verschillende groepen: de enkelvoudige en de samengestelde activiteiten. Er zijn reeds verscheidene activiteiten gedefinieerd binnen WF maar de bedoeling is natuurlijk dat elke ontwikkelaar herbruikbare activiteiten zal uitwerken al naargelang hij deze nodig heeft. Het is zelfs te verwachten dat verschillende ontwikkelaars activiteiten zullen uitwisselen en dat hier zelfs een nieuwe markt kan ontstaan. Deze manier van werken werkt de taalonafhankelijkheid van WF in de hand. Er is namelijk geen behoefte aan code binnen een workflow, de activiteiten zorgen voor de structuur van het programma en zolang de activiteiten compatibel zijn met WF maakt het niet uit in welke taal ze ontwikkeld zijn. 65

68 Windows Workflow Foundation Een aantal belangrijke activiteiten zijn: Control flow activiteiten: Sequence, Parallel, While, IfElse, Listen, EventDriven, ConditionedActivityGroup, Replicator, Delay Transactie en exception activiteiten: ExceptionHandler, Throw, Compensate, Suspen, Terminate Data/form-centric activiteiten: UpdateData, SelectData, WaitForData, WaitForQuery Communication activiteiten: InvokeWebService, WebServiceReceive, WebServiceResponse, InvokeMethod, EventSink Code activiteiten: Code State machine activiteiten: StateInitialization, State, SetState Runtime De Workflow runtime is het onderdeel van het framework dat ervoor zorgt dat workflows kunnen uitgevoerd worden. De flexibiliteit die we zien in de andere lagen is hier niet aanwezig, het is namelijk een cruciale onderdeel voor de goede werking van WF. Zoals in Figuur 27 te zien is zijn de belangrijkste onderdelen: Workflow Execution: De execution service verzorgt het plannen van de activiteiten, het opvangen van events en fouten, tracking en transacties. o Scheduler: De scheduler service zorgt ervoor dat de activiteiten op het juiste moment uitgevoerd worden. o Rules o Tracking Infrastructure: De tracking service volgt de uitvoering van de workflow en genereert bij bepaalde gebeurtenissen tracking events,die dan via de tracking interface in de Host laag verwerkt kunnen worden. Workflow Lifecycle Management o State Management: De state management service zorgt ervoor dat de toestand van alle workflows en activiteiten bijgehouden worden en dat deze op het juiste moment persistent gemaakt worden of opgehaald worden. o Activation: De activation service zorgt ervoor dat de juiste worfklows gestart worden en de juiste data krijgen Host Zoals gezegd is de Windows Workflow Foundation niet geassocieerd met één bepaald proces. Het is namelijk de bedoeling dat de ontwikkelaar vrij is om de workflow binnen een proces naar zijn keuze te hosten. Dit betekent echter wel dat er nood is aan een extra laag die ervoor zorgt dat het workflow model en de runtime niet hoeven te weten in welk proces ze gehost worden. De host laag zorgt ervoor dat de bovenliggende lagen altijd over dezelfde functionaliteit beschikken, ongeacht het type van hostproces. 66

69 Windows Workflow Foundation In Figuur 27 is te zien dat de volgende onderdelen in deze hostlaag ter beschikking zijn: Persistence: Hoewel vele workflows zeer snel zullen uitgevoerd worden en hun eindstatus bereiken, vooral sequentiële workflows dan, moeten we er toch rekening mee houden dat sommige workflows, eerder state machine workflows, langere tijd zullen bestaan. Dit kan doordat er gebruikersinvoer verwacht wordt maar dat de desbetreffende persoon op verlof is, of omdat de workflow pas op een vastgelegde datum kan beëindigd worden. Het is dan ook niet interessant om deze workflows gedurende deze periode van wachten in het geheugen te houden. Dit zou het interne geheugen onnodig belasten en zelfs tot het falen van het systeem kunnen leiden. Daarom is er dus nood aan een persistentie-infrastructuur die ervoor zal zorgen dat een niet actieve workflow automatisch ergens wordt opgeslagen vanwaar hij gemakkelijk op nieuw in het geheugen kan geladen worden. Doordat het hostproces echter uit een hele reeks technologieën gekozen kan worden zijn de mogelijkheden voor persistentie ook zeer uiteenlopend, zoals sessies in het geval van een ASP.NET host, XML files of een SQL Server database. Er is dan ook niet gekozen voor één technologie maar voor een systeem van interfaces waarbij de ontwikkelaar de interface kiest die het best past bij zijn verwachtingen van een persistentiesysteem. Communication: Naast de berichten die tussen verschillende activiteiten gestuurd worden moet er ook gecommuniceerd worden met de host applicatie. Deze berichten kunnen op zich een nieuwe workflow starten en zorgen ervoor dat de globale workflow een stap verder kan. Aangezien er op het Windows platform zeer uiteenlopende manier zijn om te communiceren is ervoor gekozen om niet in een eigen communicatiesysteem te voorzien binnen WF. Er is wel de mogelijkheid om interfaces te gebruiken, die dan voor elke manier van communiceren kunnen geïmplementeerd worden. Natuurlijk zijn er al een aantal van deze interfaces voorzien zodat de meest voorkomende communicatietoepassingen, zoals web services en het doorgeven van data objecten, op een eenvoudige manier kunnen geïntegreerd worden in een project. Timer: Binnen een workflow kan het nodig zijn dat er een bepaalde tijd moet gewacht worden vooraleer verder te gaan naar de volgende activiteit. De timer is de klok die ervoor zorgt dat dit correct gebeurt. Het kan namelijk zijn dat een workflow gedurende de wachttijd uit het geheugen gehaald wordt omdat het systeem moet herstarten. Het is dan ook belangrijk dat na deze herstart de timer nog steeds correct werkt. Tracking: Een van de belangrijke redenen om een workflowsysteem te gebruiken binnen een applicatie is de hogere transparantie van het verloop tijdens de uitvoering. De tracking events die worden gegenereerd vanuit de runtime laag worden hier opgevangen en doorgegeven naar de hostapplicatie. Die kan deze dan verder gebruiken of weergeven. Transactions: Zoals in elke applicatie is er nood aan een ondersteuning van transacties, zodat ook in het geval van fouten de gegevens zo correct mogelijk kunnen gehouden worden. 67

70 Windows Workflow Foundation Threading: Als laatste is het nodig om verschillende threads te kunnen gebruiken voor verschillende workflows, zodat deze simultaan kunnen lopen. Net zoals bij het workflow model zijn de mogelijkheden niet beperkt tot diegene die hier werden besproken. Dit zijn enkel de standaard services die door Microsoft reeds voorzien zijn. Het staat de ontwikkelaar vrij om hier nog nieuwe services aan toe te voegen of om de reeds bestaande services aan te passen aan de behoeften van de applicatie. De services waarin WF standaard voorziet zijn terug te vinden in onderstaande tabel. Tabel 2: Standaard host services Host layer Persistence Timer Threading Tracking Communications Service implementatie SQL Server state persistence Zowel een in-memory als een SQL Server-gebaseerde timer.net thread pool, ASP.NET thread pool SQL Server tracking Persistence en Event Log recording for termination.net components en web services 2.4. Gebruik van WF De basis van elke workflow binnen Windows Workflow Foundation is een activiteit. Deze activiteiten vormen de bouwstenen waarmee een Workflow wordt opgebouwd. Daarnaast zijn er een aantal events die deze activiteiten met elkaar laten communiceren. Zoals reeds vermeld zijn er enkelvoudige activiteiten en samengestelde activiteiten. We behandelen nu kort alle activiteiten die standaard meegeleverd worden bij de designer omgeving die binnen Visual Studio gebruikt wordt. Daarbij maken we verschil tussen enkelvoudige en samengestelde activiteiten en tussen activiteiten die zowel bij sequential als state machine workflows voorkomen en de activiteiten die eigen zijn aan één van de twee soorten workflows. Alle volgende activiteiten, workflows en codevoorbeelden zijn gerealiseerd in Visual Studio Hierbij werd het.net 3.0 Framework geïnstalleerd, samen met de Visual Studio Extensions for Windows Workflow Foundation. Het is ook mogelijk om zonder deze tools te werken maar dit leidt tot beduidend meer werk. 68

71 Windows Workflow Foundation Enkelvoudige activiteiten Code De code activiteit maakt het mogelijk om code binnen de workflow uit te voeren. Dit zal dan vooral om code gaan waarvoor geen activiteit voorzien is. Deze code bevindt zich dan in een aparte file die samen met de workflow gecompileerd wordt, de code-beside file. Het is de bedoeling om hier enkel lokale variabelen te gebruiken en te wijzigen. Het is niet de bedoeling dat deze code lange tijd nodig heeft om te beëindigen want dit zou de volledige workflow kunnen tegenhouden. Indien de code die hierin uitgevoerd zou worden te complex of te lang wordt is het misschien beter om op een andere manier te werken, zoals het oproepen van een andere workflow of het werken met webservices. Figuur 28: Code activiteit Delay De delay activiteit is het workflowequivalent van een sleep in vele programmeertalen. Het maakt het mogelijk om de workflow voor een bepaalde tijd stil te leggen. Voor de delay activiteit gestart wordt roept deze een InitializeTimeoutDuration gebeurtenis op waarop kan gereageerd worden in de codefile die bij de workflow hoort. Dit maakt het mogelijk om de tijd gedurende dewelke de workflow moet pauzeren afhankelijk te maken van een aantal parameters binnen de workflow. Als de workflow gedurende deze delay idle wordt dan kan het dat deze uit het geheugen gehaald wordt en pas terug in het geheugen geplaatst wordt bij het beëindigen van de delay. Of dit gebeurt is afhankelijk van de instelling van de persistence service. Figuur 29: Delay activiteit 69

72 Windows Workflow Foundation Throw De throw activiteit doet net hetzelfde als het throw commando in een programmeertaal namelijk het oproepen van een fout. Deze activiteit is dus equivalent aan een code activiteit met daarin een throw instructie. Deze manier maakt het echter visueel duidelijk om te zien waar de fout kan voorkomen. Figuur 30: Throw activiteit Terminate Een terminate activiteit beëindigt de volledige workflow en dus ook alle activiteiten die er zich binnen bevinden. Bij het gebruiken ervan in combinatie met parallelle uitvoering is het echter niet mogelijk om te voorspellen in welke toestand de parallelle activiteiten zich bevinden dus ook de toestand van de gegevens die met de workflow verbonden zijn kan niet voorspeld worden. Figuur 31: Terminate activiteit CallExternalMethod Deze activiteit wordt samen met de volgende, HandleExternalEvent, gebruikt om lokale services aan te roepen binnen de applicatie. De activiteit roept een methode op van een opgegeven interface, al dan niet met parameters. Figuur 32: CallExternalMethod activiteit 70

73 Windows Workflow Foundation HandleExternalEvent De HandleExternalEvent activiteit stopt de workflow tot de gebeurtenis plaatsvindt die opgegeven werd bij het maken van de workflow. Dit event kan het gevolg zijn van een CallExternalMethod activiteit die uitgevoerd werd in een ander deel van de workflow. Hierop hervat de workflow zijn uitvoering. Figuur 33: HandleExternalEvent activiteit InvokeWebService Met deze activiteit kan een methode van een webservice opgeroepen worden. Bij het configureren van de activiteit kan het WDSL bestand met de beschrijving automatisch opgehaald worden. Hiermee wordt een proxyobject aangemaakt waarvan dan enkel de gewenste methode moet geselecteerd worden. Figuur 34: InvokeWebService activiteit InvokeWorkflow Hiermee kan binnen een workflow een nieuwe workflow opgestart worden. Het is echter niet mogelijk om recursieve oproepen te realiseren met dit mechanisme. Figuur 35: InvokeWorkflow activiteit 71

74 Windows Workflow Foundation Policy De policy activiteit kan gezien worden als een verzameling van regels. Deze regels bestaan uit een voorwaarde met een daarbij horende actie. De structuur is vergelijkbaar met die van een ifthen-else codefragment, waarbij de voorwaarde bij de if hoort en de acties bij de then en else onderdelen. De mogelijk acties zijn: Waarden aanpassen binnen de workflow Methodes binnen de workflow oproepen Static methodes binnen een gebruikte assembly oproepen Halt of update statement uitvoeren Deze halt stopt de uitvoering van de policy activiteit meteen en laat de workflow verder gaan met de volgende activiteit. De update geeft aan dat een waarde gewijzigd is en dat de regels die gebruik maken van deze waarde opnieuw moeten uitgevoerd worden. Elke regel heeft ook een prioriteit waarmee de volgorde van de regels vastgelegd wordt. Figuur 36: Policy activiteit Suspend Door de suspend activiteit wordt de workflow tijdelijk stilgelegd, meestal omdat er een fout plaatsvindt die de aandacht van de beheerder nodig heeft. De beheerder kan dan vervolgens de fout bekijken en de workflow opnieuw laten verdergaan. Figuur 37: Suspend activiteit 72

75 Windows Workflow Foundation WebServiceInput Deze activiteit zorgt ervoor dat invoer kan ontvangen worden zoals een webservice. De WebServiceInput activiteit publiceert zichzelf als een Web services methode wanneer de web service start en ontvangt de data wanneer de overeenkomstige methode wordt opgeroepen. Deze activiteit komt meestal samen voor met de WebServiceOutput activiteit. Hierbij is het belangrijk dat deze laatste niet voor de input activiteit kan uitgevoerd worden, dit zou voor run time fouten zorgen. Het is dus belangrijk om deze voorwaarde te controleren, vooral als de input en output activiteit in andere takken van een parallel activiteit voorkomen. Figuur 38: WebServiceInput activiteit WebServiceOutput De WebServiceOuput activiteit wordt gebruikt om te antwoorden op een Web Service request dat gestuurd werd naar de workflow. Binnen een workflow waar deze output activiteit gebruikt wordt moet dan ook een WebServiceInput activiteit aanwezig zijn waarop gereageerd wordt. De WebServiceOutput activiteit moet dan verwijzen naar deze input activiteit om aan te geven op welke vraag er een antwoord gegeven wordt. Figuur 39: WebServiceOutput activiteit WebServiceFault Naast een invoer- en uitvoeractiviteit voor web services is er ook een methode om het optreden van een fout weer te geven. In tegenstelling tot de Throw activiteit, die een exception handler zal oproepen bij de uitvoering, wordt het verloop van de workflow niet gewijzigd door deze fout activiteit. Er wordt enkel een SOAP fout naar de cliënt gestuurd. Naast deze WebServiceFault om zelf een fout door te sturen naar de cliënt, zal ook elke andere fout die de workflow doet stoppen automatisch een SOAP foutboodschap versturen indien er openstaande requests zijn via een WebServiceInput activiteit. 73

76 Windows Workflow Foundation Figuur 40: WebServiceFault activiteit Compensate De Compensate activiteit start de compensation van een beëindigde activiteit die de ICompensatableActivity interface implementeert, dit zijn namelijk de enige activiteiten die kunnen gecompenseerd worden. De twee standaardobjecten die dit kunnen zijn de CompensatableTransactionScope en de CompensatableSequence activiteiten. Het is natuurlijk mogelijk om zelf activiteiten te creëren die deze interface implementeren. Het is niet nodig om een Compensate activiteit te gebruiken indien er geen andere compensation code is in een omvattende compensatable activiteit. De compensation code van elke geneste, succesvol beëindigde compensatable activiteit wordt automatisch opgeroepen indien er een fout optreedt in de workflow die niet opgevangen wordt. De Compensate activiteit moet dus enkel gebruikt worden indien er meer nodig is dan de standaard compensation. Bij een standaard gedrag zal een compensation alle kinderen van een activiteit compenseren en dit in de omgekeerde volgorde van het beëindigen ervan. Indien deze volgorde niet voldoet aan de vereisten van de workflow of als er een selectieve compensatie nodig is, kan deze activiteit gebruikt worden. Een Compensate activiteit kan echter wel enkel in een CompensationHandler, CancellationHandler of een FaultHandler activiteit voorkomen. Figuur 41: CancellationHandler met Compensate activiteit 74

77 Windows Workflow Foundation Samengestelde activiteiten IfElse De IfElse activiteit is de voorstelling van een veel gebruikte structuur bij het ontwikkelen van programma s namelijk de voorwaardelijke uitvoering van code. Deze activiteit kan uit verschillende takken bestaan met elk een voorwaarde en eventueel een tak zonder voorwaarde wat dan een else tak is. Binnen deze takken kunnen opnieuw alle activiteiten voorkomen. Bij het uitvoeren van de workflow zullen al deze voorwaarden één voor één geëvalueerd worden tot er een waar is. De activiteiten die zich binnen de overeenkomstige tak bevinden zullen dan uitgevoerd worden. Indien aan geen enkele voorwaarde voldaan wordt dan wordt de tak zonder voorwaarde uitgevoerd. Figuur 42: IfElse activiteit met IfElseBranche activiteiten While Ook de while activiteit zorgt voor een gekende constructie, namelijk de voorwaardelijke lus. Ook hier is de voorwaarde in te stellen en kan een andere activiteit gebruikt worden binnen de while activiteit. Zolang de voorwaarde waar is zal de activiteit binnen de while uitgevoerd worden. Het is belangrijk om op te merken dat er binnen de while activiteit slechts één activiteit kan voorkomen. Het is echter mogelijk om hiervoor een sequence of parallel activiteit te kiezen waarbinnen dan een onbeperkt aantal activiteiten kunnen voorkomen. 75

78 Windows Workflow Foundation Figuur 43: While activiteit Sequence Deze activiteit wordt gebruikt om verschillende activiteiten te groeperen en sequentieel uit te voeren. We kunnen deze dan ook zien als een kleine workflow binnen de workflow. De sequence activiteit wordt ook gebruikt binnen de parallel activiteit om verschillende activiteiten tegelijkertijd uit te voeren. Daarnaast kan ze gebruikt worden om activiteiten die maar één kindactiviteit kunnen bevatten toch meer mogelijkheden te geven. Figuur 44: Sequence activiteit CompensatableSequence Dit is een compenseerbare variant van de Sequence activiteit. Doordat deze activiteit de ICompensatable activiteit implementeert kan deze CompensationHandler activiteiten als kind hebben. Indien er compensatie nodig is voor de CompensatableSequence zal deze handler uitgevoerd worden. Compensatie zal enkel voorkomen bij succesvol beëindigde activiteiten die de ICompensatableActivity interface implementeren. Het compenseren zelf kan het gevolg zijn van een fout in een ouder activiteit of door het expliciet oproepen ervan met een Compensate activiteit. De CompensatableSequence kan gebruikt worden voor niet-transactioneel werk, dat door het voorkomen van een fout ongedaan moet kunnen gemaakt worden. 76

79 Windows Workflow Foundation Figuur 45: CompensatableSequence activiteit Parallel Door de parallel activiteit kunnen verschillende delen van de workflow tegelijkertijd uitgevoerd worden. Dit kan handig zijn als de deelactiviteiten geen gegevens delen en zo onafhankelijk hun werk kunnen doen. De uitvoering van de verschillende deelactiviteiten is echter niet simultaan. In de praktijk begint de workflow met de eerste activiteit in één van de takken, voert deze volledig uit en begint dan aan de volgende activiteit. Dit is dan meestal de eerste activiteit in een andere tak. Komt de workflow ergens een delay tegen, dan wacht deze echter niet op het beëindigen ervan maar gaat meteen door naar de volgende activiteit. Dit verloop is te verklaren doordat een workflow slechts één thread gebruikt. Echt parallellisme is dus niet mogelijk binnen een workflow. Figuur 46: Parallel activiteit met Sequence activiteiten 77

80 Windows Workflow Foundation ConditionedActivityGroup De ConditionedActivityGroup activiteit bevat een verzameling van activiteiten waarvan de volgorde van uitvoeren bepaald wordt door voorwaarden die bij die activiteiten horen. Deze activiteit ondersteunt meerdere mogelijkheden om met de voorwaarden om te gaan, zoals een parallelle uitvoering die vergelijkbaar is met de Parallel activiteit of een herhalingsgedrag. Het is namelijk mogelijk om doorheen de activiteiten te lopen en dit te blijven herhalen tot een algemene voorwaarde die bij de groep hoort bereikt wordt. Wordt deze algemene voorwaarde niet ingesteld, dan stopt de activiteit wanneer alle kindactiviteiten gestopt zijn, dus op het moment dat er niet meer aan de voorwaarden van de kindactiviteiten voldaan wordt. Als ook de voorwaarde van een kindactiviteit niet ingevuld is dan wordt de activiteit slechts één maal uitgevoerd. Elke keer een kindactiviteit beëindigd wordt evalueert de workflow de voorwaarde voor de groep en de voorwaarden voor de kindactiviteiten en bepaalt vervolgens welke activiteiten moeten gestart worden. Indien een kindactiviteit meerdere malen wordt uitgevoerd, dan wordt voor elk voorkomen van de activiteit een aparte instantie van de activiteit gecreëerd zodat deze onafhankelijk van mekaar kunnen afgehandeld worden en dus ook parallel. Dit gedrag is gelijkaardig met dit van de Replicator activiteit. Figuur 47: ConditionedActivityGroup activiteit EventHandlingScope Een EventHandlingScope maakt het mogelijk om een kindactiviteit uit te voeren, samen met een EventHandlers activiteit. Elke EventDriven activiteit binnen deze EventHandlers kan maar moet niet uitgevoerd worden en dit kan meerdere malen gebeuren. De bedoeling hiervan is dat een bepaalde activiteit kan gestart worden terwijl ook geluisterd wordt naar een aantal events die de gestarte activiteit kunnen beïnvloeden zoals een cancel event. 78

81 Windows Workflow Foundation Figuur 48: EventHandlingScope activiteit Replicator De Replicator activiteit zorgt ervoor dat een aantal instanties van een bepaalde activiteit kunnen gemaakt worden tijdens het uitvoeren van de workflow. Een Replicator activiteit kan maar één kindactiviteit bevatten maar dit mag wel een samengestelde activiteit zijn. Deze activiteit beëindigt zijn uitvoering waneer alle kindactiviteiten beëindigd werden. Het is ook mogelijk om een voorwaarde in te stellen die de uitvoering vroegtijdig stopt. Indien een Replicator met zo een voorwaarde op een punt komt waar al zijn kindactiviteiten zijn uitgevoerd maar de voorwaarde een negatief resultaat geeft, dan blijft deze wachten. Om de workflow verder te laten gaan is het dan nodig om een nieuw kind aan de Replicator toe te voegen dat ervoor zorgt dat de stopvoorwaarde wel bereikt wordt. Een Replicator heeft twee instellingen nodig waaronder de manier van uitvoeren, die sequentieel of parallel kan zijn. Bij de parallelle versie worden alle kindactiviteiten gecreëerd bij het aanvatten van de activiteit. Bij een sequentiële uitvoering wordt elk kind uitgevoerd nadat het vorige beëindigd werd. Daarnaast moet er een verzameling beschikbaar zijn met de data voor elk kind van de activiteit. Het is ook mogelijk om een aantal event handlers in te stellen die kunnen reageren op het starten en beëindigen van een kindactiviteit of het beëindigen van de volledige Replicator activiteit. Indien een kind activiteit meerdere malen moet uitgevoerd worden, wordt ook hier een aparte instantie van deze activiteit aangemaakt zodat deze instanties parallel kunnen verwerkt worden. De definitie van de activiteit die we in de workflow vinden wordt dus nooit uitgevoerd en bevindt zich steeds in de Initialized state. De verschillende instanties van de activiteit kunnen opgevraagd worden via de Replicator activiteit. 79

82 Windows Workflow Foundation Figuur 49: Replicator activiteit SynchronizationScope Deze activiteit voert al zijn kindactiviteiten uit op een sequentiële manier maar binnen een gesynchroniseerd domein. Parallel uitgevoerde SynchronizationScope activiteiten die met elkaar verbonden worden zorgen ervoor dat hun kindactiviteiten een wederzijds gesynchroniseerde toegang hebben tot hun gedeelde activiteiten. Figuur 50: SynchronizationScope activiteit TransactionScope Een TransactionScope activiteit biedt een eenvoudige manier om transacties te gebruiken, die automatisch een rollback uitvoeren indien er zich een fout voordoet. Deze activiteit is beperkt in voorkomen en kan dus geen kind zijn van volgende activiteiten: Een andere TransactionScope activiteit CompensatableTransactionScope CompensatableSequence Een eigen activiteit die het PersistOnCloseAttribute heeft Een eigen activiteit die ICompensatableActivity implementeert Daarnaast is het niet mogelijk om een suspend activiteit te gebruiken binnen deze TransactionScope. Bij het creëren van een workflow die de TransactionScope activiteit of een activiteit die het PersistOnCloseAttribute bevat, is het nodig dat een persistence service wordt gedefinieerd, 80

83 Windows Workflow Foundation anders kunnen deze activiteiten niet uitgevoerd worden en zal er bij het uitvoeren een fout voorkomen. Figuur 51: TransactionScope activiteit CompensatableTransactionScope De CompensatableTransaction activiteit is een compenseerbare versie van de TransactionScope activiteit die de ICompensatable interface implementeert. Deze activiteit is handig om een aantal acties uit te voeren die op zich transacties zijn en bij het falen van één ervan moeten ongedaan gemaakt worden. Het is wel belangrijk om op te merken dat de activiteiten ongedaan gemaakt worden en dat er geen rollback plaatsvindt aangezien een deel van de transacties succesvol kunnen beëindigd zijn voor de fout optrad. Figuur 52: CompensatableTransactionScope activiteit FaultHandlers & FaultHandler De FaultHanders activiteit bevat een geordende lijst van FaultHandler activiteiten. Deze FaultHandler activiteiten zijn de workflow implementatie van een catch structuur binnen programmeertalen. Ze zorgen dat een fout wordt opgevangen en dat de activiteiten binnen de FaultHandler worden uitgevoerd om de nodige acties uit te voeren. 81

84 Windows Workflow Foundation Figuur 53: FaultHandlers activiteit met FaultHandler activiteit Activiteiten eigen aan een Sequential Workflow Listen De Listen activiteit is een samengestelde activiteit die steeds minimum twee kind activiteiten heeft. Elk van die kinderen is een EventDriven activiteit. De Listen activiteit wordt gebruikt in een workflow die wacht op een aantal events. Van zodra één van die events plaatsvindt wordt de bijhorende EventDriven activiteit uitgevoerd, worden alle andere takken geannuleerd en stopt de Listen activiteit met luisteren naar die events. Figuur 54: Listen activiteit met EventDriven activiteiten EventDriven Binnen een EventDriven activiteit komt een sequence van activiteiten voor die pas uitgevoerd worden na een bepaald event. De eerste activiteit in die sequence moet afgeleid zijn van de IEventActivity interface, zodat hij kan reageren op events. Een voorbeeld van zo een activiteiten die wachten op externe input is de HandleExternalEvent of Delay activiteit. 82

85 Windows Workflow Foundation Activiteiten eigen aan een State Machine Workflow SetState Binnen een state machine workflow zorgt de SetState activiteit voor de overgang tussen verschillende toestanden. Hierbij moet de toestand waarnaar overgegaan wordt een leaf toestand zijn, wat wil zeggen dat deze geen andere toestanden bevat. Figuur 55: SetState activiteit binnen een EventDriven activiteit State De State activiteit is het hoofdonderdeel van een state machine workflow. Aangezien events op meerdere momenten in een state machine workflow kunnen voorkomen worden toestanden gebruikt om de taken vast te leggen die bij die events horen. Bij het doorlopen van de workflow kan deze verschillende toestanden aannemen, waarbij dezelfde toestand eventueel meerdere keren kan bereikt worden. Binnen een state activiteit kunnen EventDriven, StateInitialization, StateFinalization of andere State activiteiten voorkomen. Indien een bepaalde kind activiteit meerdere malen wordt uitgevoerd, dan voorziet WF in een aparte instantie voor elke iteratie. Op die manier kunnen deze aparte objecten onafhankelijk van elkaar verwerkt worden. Een gevolg hiervan is dat de definitie van een kind activiteit in de activity tree (de template) nooit uitgevoerd wordt en dus altijd in de Initialized status blijft. De gebruikte instanties van deze template worden beheerd door de bovenliggende samengestelde activiteit en kunnen via die activiteit benaderd worden. 83

86 Windows Workflow Foundation Figuur 56: Workflow met drie states StateInitialization De StateInitialization activiteit is een container waar activiteiten in ondergebracht kunnen worden die worden uitgevoerd bij het bereiken van de status waarbinnen deze activiteit zich bevindt. Er kan maximum één zo een activiteit binnen een status voorkomen. Figuur 57: StateInitialization activiteit StateFinalization Analoog met de StateInitialization activiteit zorgt deze activiteit ervoor dat de nodige activiteiten worden uitgevoerd bij het verlaten van de toestand waarin deze voorkomt. Figuur 58: StateFinalization activiteit 84

87 Windows Workflow Foundation EventDriven Binnen een state machine workflow kan een EventDriven activiteit als een kind van de State activiteit opgenomen worden of in de workflow zelf. Bij het gebruiken binnen de workflow kan er slechts één van IEvent afgeleide activiteit gebruikt worden en moet deze als eerste binnen de state voorkomen. Dit is zo omdat het state machine workflow model dat Windows Workflow Foundation implementeert slechts één EventDriven activiteit per keer kan verwerken. Mochten er nu meerdere IEvent activiteiten mogen voorkomen dan bestaat de kans dat een EventDriven activiteit wacht op een bepaald event dat misschien nooit voorkomt. Dit zou ervoor zorgen dat de state machine workflow geen verdere berichten kan verwerken. Figuur 59: EventDriven activiteit Creatie van een workflow De eenvoudigste manier om een workflow, zowel sequential als state machine, te maken is binnen de Workflow Designer. Standaard wordt deze gebruikt binnen Visual Studio 2005 waarbinnen project templates beschikbaar zijn voor verschillende soorten workflows. De manier van werken is gelijkaardig met die bij het ontwerpen van Windows Forms binnen Visual Studio. Er is een toolbox beschikbaar met de verschillende activiteiten en deze kunnen op de workflow gesleept worden. Daarnaast is er per activiteit die onderdeel uitmaakt van de workflow een venster om de eigenschappen ervan in te stellen. Deze Workflow Designer is beperkt tot het gebruik van C# of Visual Basic. Het gebruik van de Designer is echter niet verplicht want het opbouwen van workflows kan ook volledig vanuit code. Hierbij valt de beperking van C# of Visual Basic weg en kan de ontwikkelaar elke taal gebruiken die door de.net CLR ondersteund wordt. Zoals gezegd is het mogelijk om workflows vanuit code te definiëren. Het is dan ook niet verwonderlijk dat een workflow eigenlijk een gewone klasse is. In de namespaces System.Workflow.Activities, System.Workflow.ComponentModel en System.Workflow.Runtime bevinden zich alle types die nodig zijn om workflows en activiteiten te maken en uit te voeren. Opnieuw kan hier de vergelijking gemaakt worden met het systeem bij de Windows Forms: bij het aanmaken van een nieuw object van de workflow klasse zal de constructor ervoor zorgen dat alle activiteiten die zich in de workflow bevinden aangemaakt worden en de juiste configuratie meekrijgen, net zoals een Form zijn controls initialiseert. 85

88 Windows Workflow Foundation Naast deze mogelijkheid om code te gebruiken bij het maken van een workflow is het ook mogelijk om dit in XML te doen. Deze mogelijkheid is voorzien omdat veel ontwikkelaars deze manier verkiezen boven het schrijven en compileren van code. Daarnaast genereert de Worfklow Designer ook deze XML files dus deze kunnen altijd geraadpleegd worden. Hoe de workflow ook gedefinieerd is, hetzij via één van de vorige methoden of een combinatie ervan, na compilatie wordt het een standaard.net assembly Definiëren van een Sequential Workflow Om een sequential workflow te maken zijn er twee zaken vereist: een begin en een einde. Tussen deze twee toestanden kunnen verschillende activiteiten voorkomen en afhankelijk van een aantal controles kunnen verschillende wegen gevolgd worden, worden bepaalde activiteiten één, meerdere malen of geen enkele keer uitgevoerd. De belangrijkste eigenschap is echter dat de weg die binnen de workflow gevolgd wordt perfect voorspelbaar is. Als we twee maal eenzelfde opdracht uitvoeren, dan zal deze identiek dezelfde weg volgen en kunnen we dus ook het resultaat ervan voorspellen. Het definiëren van een sequential workflow komt er dus op neer om het proces dat geïmplementeerd moet worden te analyseren en op te splitsen in verschillende onderdelen die dan als een activiteit of een verzameling van activiteiten in de workflow kunnen geplaatst worden Voorbeeld van een Sequential Workflow Om te tonen hoe een eenvoudige Sequentiele workflow gemaakt worden volgt nu een klein voorbeeld om één van de meest gekende voorbeeldapplicaties te maken, namelijk een Hello, World! workflow. We zullen hierbij gebruik maken van Visual Studio 2005, waarbij het.net 3.0 Framework is geïnstalleerd samen met de Visual Studio 2005 Extensions for Windows Workflow Foundation. Hierdoor hebben we een grafische designer tot onze beschikking en kunnen we de applicatie runnen vanuit verschillende hosts, waaronder console applicaties of Windows Forms applicaties. Om deze workflow en de host applicatie te creëren zullen we gebruik maken van C#, als is VB.Net eveneens mogelijk. Om zo een project te starten openen we Visual Studio Vervolgens maken we een nieuw Workflow Project door File New Project te selecteren. In het dialoogvenster kiezen we in de Visual C# Workflow tak voor een Empty Workflow Project en kiezen we een naam en locatie voor het project Hiermee hebben we een nieuw project gestart, nu moeten we er een workflow aan toevoegen. Om dit te doen selecteren we het Project Add Sequential Workflow menu. In het dialoogvenster kiezen we voor de workflow template Sequential Workflow (with code separation) en kiezen eventueel een naam. Deze manier van werken levert een 86

89 Windows Workflow Foundation Workflow1.xoml bestand op waarin we de XML workflow markup terugvinden en een Workflow1.xoml.cs bestand met daarin de code die bij de workflow hoort. Nu kunnen we beginnen met het definiëren van de workflow. We willen dat de workflow gestart wordt met twee parameters, een naam en een voornaam. Indien deze ingevuld zijn verschijnt een boodschap in de vorm van Hello, World: <voornaam> <naam>. Blijven deze parameters leeg, dan verschijnt de standaardboodschap Hello, World!. Om dit gedrag te realiseren moeten we eerst een aantal zaken aan de workflow toevoegen. Bij de creatie van de workflow is deze natuurlijk leeg, hier moeten we twee properties aan toevoegen om de naam en de voornaam bij te houden. De oorspronkelijke code ziet er als volgt uit: public partial class Workflow1 : SequentialWorkflowActivity Code Listing 23: Originele code van de workflow Deze passen we aan zodat we volgende code bekomen: public partial class Workflow1 : SequentialWorkflowActivity private string firstname; private string lastname; public string FirstName get return firstname; set firstname = value; public string LastName get return lastname; set lastname = value; Code Listing 24: Code van de workflow na toevoegen van de properties Dit kunnen we eenvoudig doen door gebruik te maken van het intelli-sense systeem binnen Visual Studio Hiertoe typen we prop op de plaats waar de code willen tussenvoegen, waarna een lijstje verschijnt met alle mogelijkheden. 87

90 Windows Workflow Foundation Figuur 60: Gebruik van code snippets in Visual Studio 2005 Hierin selecteren we de prop Code snippet en drukken we tweemaal op tab. De onderstaande code wordt dan tussengevoegd. Figuur 61: Voorbeeld van een property code snippet Als laatste moeten we dan de gekleurde velden vervangen door het type en de naam van onze parameter en we zijn klaar. Vervolgens kunnen we de logica aan de workflow toevoegen. Hiervoor hebben we een IfElse activiteit nodig om de juiste actie uit te voeren. Hiertoe kiezen we deze activiteit uit de toolbox en slepen we deze op de workflow. 88

91 Windows Workflow Foundation Figuur 62: Sequential Workflow Van zodra we dit doen zien we aan het rode uitroepteken dat er iets fout is. Dit is een manier waarop Visual Studio een aantal compileer fouten wil vermijden door op voorhand aan te geven dat een verplichte parameter nog niet gedefinieerd is. Hier is dit bijvoorbeeld de voorwaarde bij de eerst IfElsetak. Deze kunnen we aan de hand van de volgende stappen definieren. Figuur 63: Properties venster van de IfElse activiteit Bij de properties van deze IfElsetak kiezen we bij de condition voor een Declarative Rule condition. Vervolgens klikken we op de knop met drie puntjes om de voorwaarde te definieren. In het dialoogvenster dat verschijnt kiezen we voor een nieuwe regel en in het nieuwe venster kunnen we deze definieren. Hierbij moeten we ervoor zorgen dat de regel als true geëvalueerd wordt indien de IfElse tak moet uitgevoerd worden. 89

92 Windows Workflow Foundation Figuur 64: Dialoog venster om de voorwaarde te definiëren Nu moeten we er enkel nog voor zorgen dat er in de twee IfElse takken effectief iets uitgevoerd wordt. Daarvoor zullen we gebruik maken van een MessageBox. Hiervoor moeten we natuurlijk eerst een reference leggen naar de System.Windows.Forms library. Vervolgens slepen we een code activiteit in elk van de takken die deze messagebox zal tonen. Figuur 65: Sequential Workflow Opnieuw zien we de rode uitroeptekens bij de twee code activiteiten die aanduiden dat de ExecuteCode property nog niet ingevuld is. Door dubbel te klikken op de code activiteit wordt automatisch een methode gecreërd in de code-beside file en wordt hiernaar verwezen vanuit de ExecuteCode property. Wij moeten dan enkel nog de gewenste code toevoegen binnen deze methode. 90

93 Windows Workflow Foundation //Weergeven van de MessageBox indien de naam is ingevuld private void codeactivity1_executecode(object sender, EventArgs e) System.Windows.Forms.MessageBox.Show("Hello world: " + firstname + " " + LastName); //Weergeven van de MessageBox indien de naam niet is ingevuld private void codeactivity2_executecode(object sender, EventArgs e) System.Windows.Forms.MessageBox.Show("Hello, world!"); Code Listing 25: ExecuteCode methodes van de code activiteiten Het is natuurlijk mogelijk om deze methoden vooraf te definieren met iets duidelijkere namen. Het is wel belangrijk dat ze dezelfde signatuur hebben maar van zodra daaraan is voldaan kunnen ze geselecteerd worden bij de ExecuteCode property van een IfElse tak. Nu hebben we de workflow gedefinieerd en bevat deze het gewenste gedrag. De volgende stap is het schrijven van een applicatie die deze workflow gebruikt. Hiervoor volstaat een eenvoudige console applicatie die we als nieuw project toevoegen. Ook hier moeten we een referentie toevoegen, ditmaal naar het project waarin de workflow gedefinieerd is. Daarnaast moeten ook de library s van de Workflow Foundation worden toegevoegd, dit zijn de System.Workflow.Activities, System.Workflow.Runtime en de System.Workflow.ComponentModel library s. De code die we dan in program.cs moeten schrijven is de volgende: class Program static void Main(string[] args) using (WorkflowRuntime workflowruntime = new WorkflowRuntime()) /* * De volgende code zorgt ervoor dat de hostapplicatie * verwittigd wordt van het beeindigen van * de applicatie, zowel door een fout als * door het afwerken van de workflow. */ AutoResetEvent waithandle = new AutoResetEvent(false); workflowruntime.workflowcompleted += delegate(object sender, WorkflowCompletedEventArgs e) waithandle.set(); ; workflowruntime.workflowterminated += delegate(object sender, WorkflowTerminatedEventArgs e) Console.WriteLine(e.Exception.Message); waithandle.set(); ; /* * Verzameling maken met daarin de parameters die * worden doorgegeven aan de workflow. * Hierbij gebruiken we * een string als index die dan gebruikt wordt * om de parameter met die naam op te vullen. * De waarde kan een willekeurig object zijn * maar moet van hetzelfde type zijn als * de parameter in de workflow waaraan * hij zal toegewezen worden. */ 91

94 Windows Workflow Foundation Dictionary<string, object> parameters = new Dictionary<string, object>(); parameters.add("firstname", "Fréderic"); parameters.add("lastname", "Spileers"); /* * Het creeren van een nieuwe instance * van de workflow. De typeaanduiding * geeft aan welke workflow we willen * maken, het parameters oject is * de verzameling die hierboven is aangemaakt. * Vervolgens wordt de nieuwe instance gestart. */ WorkflowInstance instance = workflowruntime.createworkflow( typeof(helloworldworkflow.workflow1), parameters); instance.start(); /* * Vanaf hier wacht de host applicatie op een signaal * van de workflow dat zal gezet worden door de delegates * bij de workflowcompleted en workflowterminated events */ waithandle.waitone(); Code Listing 26: Code van het programma dat de workflow uitvoert Zoals eerder vermeld is het ook mogelijk om workflows als XML te definieren. Ter illustratie volgt nu de XML code die achter de grafische voorstelling van deze workflow schuilt: <SequentialWorkflowActivity x:class="helloworldworkflow.workflow1" x:name="workflow1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"> <IfElseActivity x:name="ifelseactivity1"> <IfElseBranchActivity x:name="ifelsebranchactivity1"> <IfElseBranchActivity.Condition> <RuleConditionReference ConditionName="Condition1" /> </IfElseBranchActivity.Condition> <CodeActivity x:name="codeactivity1" ExecuteCode="codeActivity1_ExecuteCode" /> </IfElseBranchActivity> <IfElseBranchActivity x:name="ifelsebranchactivity2"> <CodeActivity x:name="codeactivity2" ExecuteCode="codeActivity2_ExecuteCode" /> </IfElseBranchActivity> </IfElseActivity> </SequentialWorkflowActivity> Code Listing 27: XML voorstelling van de workflow Ontwikkelaars die dit willen kunnen dus ook meteen deze code schrijven en samen met de code-beside file compileren tot een workflow die exact hetzelfde zal doen Definiëren van een State Machine Workflow In tegenstelling tot een sequential workflow heeft een state machine workflow geen vaste structuur en is het verloop van de workflow veel minder voorspelbaar. Hier bestaat een workflow uit een aantal toestanden waarin die workflow zich kan bevinden en een aantal events, die ervoor kunnen zorgen dan een workflow van de ene toestand in een andere overgaat. Deze manier van werken is ideaal als men op voorhand niet kan voorspellen welke events allemaal zullen plaatsvinden of wanneer deze juist zullen uitgevoerd worden. Het is ook 92

95 Windows Workflow Foundation een oplossing voor problemen waar het aantal mogelijke paden zeer groot is en dus moeilijk met een sequential workflow voor te stellen zijn. Bij het definiëren van een state machine workflow is het dus belangrijk om vooraf vast te leggen in welke toestanden de workflow zich kan bevinden en door welke acties deze kan overgaan naar een andere toestand. Daarnaast is het ook mogelijk om binnen die toestanden en acties sequential workflows te gebruiken om een deel van het proces te realiseren Voorbeeld van een State Machine Workflow Als voorbeeld bij de State Machine Workflow zullen we een variant maken van de Hello, World! sequential workflow die in het vorige onderdeel aan bod kwam. Het grote verschil is hier dat de acties door events gestart worden en niet op een sequentiële manier voorkomen. Dit zorgt ervoor dat er wat meer werk is om dit soort workflows te maken maar dit ligt vooral aan het voorbereidend werk van events definiëren en oproepen. Bij het maken van een nieuw project is er reeds een eerste state activiteit aanwezig die meteen ook de Initial State is, dus het beginpunt van de workflow. Om onze applicatie te realiseren voegen we twee toestanden toe, een DisplayState, waarin de boodschap in een Messagebox zal getoond worden, en een CompletedState die het einde van de workflow weergeeft. Deze nieuwe state moet ingesteld worden als Completed State door in het context menu op Set as Completed State te klikken. De Workflow ziet er nu zo uit: Figuur 66: State Machine Workflow Voor we verder kunnen met de workflow moeten een aantal extra klassen gemaakt worden om het gebruikte event te definiëren. Eerste hebben we de Interface IMessageService waar het event ShowMessage wordt gedeclareerd. Daarnaast is er de klasse MessageEventArgs die de argumenten van het event bevat. Hierin zien we de string message die zal gebruikt worden om de Hello, World! boodschap door te geven. 93

96 Windows Workflow Foundation [Serializable] public class MessageEventArgs : ExternalDataEventArgs private string message; public string Message get return message; set message = value; private string workflowid; public string WorkflowId get return workflowid; set workflowid = value; public MessageEventArgs(Guid g, string m) : base(g) message = m; workflowid = g.tostring(); [ExternalDataExchange] public interface IMessageService event EventHandler<MessageEventArgs> ShowMessage; Code Listing 28: IMessageService interface en MessageEventArgs klasse Daarnaast hebben we ook de MessageService klasse nodig die deze interface implementeert en ervoor zorgt dat het event opgeroepen wordt. public class MessageService : IMessageService public MessageService() public void RaiseShowMessageEvent(string workflowid, string message) if (ShowMessage!= null) Guid g = new Guid(workflowId); ShowMessage(null, new MessageEventArgs(g, message)); public event EventHandler<MessageEventArgs> ShowMessage; Code Listing 29: MessageService klasse die de IMessageService interface implementeert De volgende stap is het verder uitwerken van de workflow states. We beginnen bij de InitialState waar we een handleexternalevent activiteit aan toevoegen die zal wachten op het ShowMessage event. Binnen de code van de workflow voegen we twee regels code toe die het mogelijk maken om de properties van het event op te vangen. 94

97 Windows Workflow Foundation public sealed partial class Workflow1: StateMachineWorkflowActivity public MessageEventArgs MessageEvtArgs = default(messageeventargs); public object sender = new System.Object(); public Workflow1() InitializeComponent(); Code Listing 30: Code van de workflow Vervolgens worden het sender en MessageEvtArgs object binnen de handleexternalevent gedefinieerd in het properties venster. Het InterfaceType is de hiervoor gedeclareerde IMessageService en de eventnaam is ShowMessage. Als reactie op het event moet de workflow overgaan naar de volgende state, dit doen we door gebruik te maken van een SetState activiteit waarvan we de TargetStateName property instellen op de DisplayState. Figuur 67: InitialState van de Workflow Binnen deze DisplayState willen we dat de boodschap die door het event wordt doorgegeven in een Messagebox wordt getoond. Hiervoor maken we gebruik van een code activiteit zoals in de sequential workflow. Deze staat binnen een stateinitialization activiteit die alle activiteiten bevat die moeten uitgevoerd worden bij het aankomen in deze state. 95

98 Windows Workflow Foundation Figuur 68: Display State van de Workflow Binnen de handler van de code activiteit vinden we volgende code: private void codeactivity1_executecode(object sender, EventArgs e) System.Windows.Forms.MessageBox.Show(MessageEvtArgs.Message); Code Listing 31: Execute Code methode van de code activiteit Ook hier volgt een SetState activiteit die de workflow laat overgaan naar de Completed state. Naast de workflow is er natuurlijk nog een programma nodig dat ervoor zorgt dat de workflow wordt uitgevoerd. class Program static void Main(string[] args) using (WorkflowRuntime workflowruntime = new WorkflowRuntime()) /* * Deze service zorgt ervoor dat er data kan uitgewisseld worden met de * workflow via de events. */ ExternalDataExchangeService extdataexchservice = new ExternalDataExchangeService(); workflowruntime.addservice(extdataexchservice); workflowruntime.startruntime(); /* * Dit is de zelfgemaakte service die we zullen gebruiken om het event * naar de workflow te sturen. */ HelloWorldStateMachine.MessageService mymessage = workflowruntime.getservice<helloworldstatemachine.messageservice>(); if (mymessage == null) mymessage = new HelloWorldStateMachine.MessageService(); extdataexchservice.addservice(mymessage); /* * De volgende code zorgt ervoor dat de hostapplicatie verwittigd wordt * van het beeindigen van de applicatie, zowel door een fout als * door het afwerken van de workflow. */ 96

99 Windows Workflow Foundation AutoResetEvent waithandle = new AutoResetEvent(false); workflowruntime.workflowcompleted += delegate(object sender, WorkflowCompletedEventArgs e) waithandle.set(); ; workflowruntime.workflowterminated += delegate(object sender, WorkflowTerminatedEventArgs e) Console.WriteLine(e.Exception.Message); waithandle.set(); ; /* * Het creeren van een nieuwe instance van de workflow. De typeaanduiding * geeft aan welke workflow we willen maken. * Vervolgens wordt de nieuwe instance gestart. */ WorkflowInstance instance = workflowruntime.createworkflow( typeof(helloworldstatemachine.workflow1), new Dictionary<string, object>()); instance.start(); /* * In een real-life applicatie wacht de applicatie hier op * gebruikersinvoer. Het raisen van het event zou dan * het gevolg zijn van deze invoer. */ HelloWorldStateMachine.MessageService m = workflowruntime.getservice< HelloWorldStateMachine.MessageService>(); m.raiseshowmessageevent(instance.instanceid.tostring(), "Hello, World!"); /* * Vanaf hier wacht de host applicatie op een signaal * van de workflow dat zal gezet worden door de delegates * bij de workflowcompleted en workflowterminated events */ waithandle.waitone(); Code Listing 32: Programma dat de workflow uitvoert Creatie van activiteiten Activiteiten zijn zoals eerder gezegd de bouwstenen van een workflow. Ze kunnen echter zeer uiteenlopend zijn, van kleine en eenvoudige activiteiten zoals Delay tot complexe zelfgedefinieerde activiteiten. Deze zelfgedefinieerde activiteiten kunnen zowel helemaal uit het niets geschreven worden of kunnen afgeleid worden van een reeds bestaande activiteit. Ook hier is de opsplitsing te maken tussen enkelvoudige en samengestelde activiteiten. We kunnen een workflow zelfs zien als een speciaal geval van een samengestelde activiteit. Hoe eenvoudig of complex ook, elke activiteit is gebaseerd op dezelfde interfaces uit de workflow namespaces. De eenvoudigste manier om een activiteit te maken is opnieuw de grafische designer, nu de Activity Designer. Net zoals bij workflows is het ook mogelijk om dit rechtstreeks in code te doen, aangezien een activiteit ook een klasse is. Bij een activiteit kunnen een aantal events horen waarop die activiteit reageert en een aantal attributen die de toestand van de activiteit bepalen. Ongeacht of de activiteit vanuit code opgebouwd is of via de grafische designer, het is voor de auteur mogelijk om in te stellen hoeveel van de interne logica te zien is door een ontwikkelaar die de activiteit in een workflow wil gebruiken. Daarnaast kan het uitzicht van de activiteit ook 97

100 Windows Workflow Foundation aangepast worden, zodat de activiteit een eigen look & feel krijgt in de Workflow Designer. Zo is het mogelijk om een workflow er uniform uit te laten zien, zelfs met het gebruik van eigen activiteiten Voorbeeld van een Activiteit Als voorbeeld bij het maken van een nieuwe activiteit zullen we de sequentiële workflow van het vorige onderdeel aanpassen. De code activiteit die daar de Messagebox weergeeft zal nu enkel een boodschap opstellen. De nieuwe activiteit zal dan deze boodschap weergeven in een Messagebox. Om te beginnen voegen we een nieuw project toe aan onze solution, namelijk een Worfklow Activity Library. De standaardactiviteit Activity1.cs kunnen we een iets zinvollere naam geven, ShowMessageActivity.cs. Bij de properties van deze activiteit moeten we vervolgens instellen van welke soort activiteit ze is afgeleid. We klikken hiervoor op de drie puntjes en in het dialoog venster kiezen we onder de System.Workflow.ComponentModel voor de Activity. De volgende stap is het toevoegen van een property aan deze activiteit die de weer te geven boodschap kan bevatten. Dit doen we door volgende code in te voegen: public partial class ShowMessageActivity : System.Workflow.ComponentModel.Activity public ShowMessageActivity() InitializeComponent(); public static DependencyProperty MessageProperty = System.Workflow.ComponentModel.DependencyProperty.Register( "Message", typeof(string), typeof(showmessageactivity)); [Description("Message to show")] [Category("ShowActivity")] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string Message get Return ((string)(base.getvalue( ShowMessageActivity.MessageProperty))); set base.setvalue(showmessageactivity.messageproperty,value); Code Listing 33: Code van de nieuwe ShowMessageActivity klasse Deze property heeft een aantal attributen die ingesteld worden en het gedrag ervan bepalen. De betekenis van een aantal hiervan is terug te vinden in de volgende tabel: 98

101 Windows Workflow Foundation Tabel 3: Mogelijke attributen van een property Naam Type Beschrijving Browseable Boolean Geeft aan of de property in het property venster voorkomt. Category String Een zelfgedefinieerde categorie voor de property. Description String Een beschrijving voor de property DesignerSerializationVisibility Visible, Bepaalt de serialisatie van de property. Hidden Visible (default): De property wordt gewoon of Content geserialiseerd. Hidden: De property wordt niet geserialiseerd. Content: Wordt gebruikt voor Collections. Het Collection object zelf wordt niet geserialiseerd maar de inhoud ervan wel. ValidationVisibility Optional, Required of Hidden Indien een ontwikkelaar voor een Collection object kiest zal de property ingesteld worden op Content, kiest hij voor een niet serialiseerbaar object, dan zal deze op Hidden gezet worden. Geeft aan hoe de property gevalideerd wordt. Optional (default): De property kan null waarden bevatten. Required: De property moet een niet-null waarde bevatten en dit wordt gecontroleerd. Hidden: Er wordt standaard geen validatie uitgevoerd. Daarnaast is het ook nodig om aan te geven wat de activiteit moet doen bij het uitvoeren ervan. Dit kunnen we doen door de Execute methode te overschrijven met daarin de code die moet uitgevoerd worden. Hierin wordt de boodschap in een Messagebox getoond, waarna de activiteit aangeeft dat de uitvoering beeindigd werd. protected override ActivityExecutionStatus Execute( ActivityExecutionContext executioncontext) System.Windows.Forms.MessageBox.Show(Message); return ActivityExecutionStatus.Closed; Code Listing 34: Execute methode van de ShowMessageActivity Na het rebuilden van het project is de activiteit beschikbaar in de toolbox. Figuur 69: Toolbox met daarin de ShowMessageActivity 99

102 Windows Workflow Foundation Binnen dit project kan deze dus eenvoudig op de workflow gesleept worden om de workflow er als volgt te laten uitzien: Figuur 70: Sequential Workflow De code binnen de workflow moeten we als volgt aanpassen: public partial class Workflow1 : SequentialWorkflowActivity private string firstname; private string lastname; private string message; public string FirstName get return firstname; set firstname = value; public string LastName get return lastname; set lastname = value; public string Message get return message; set message = value; //Instellen van de boodschap indien de naam is ingevuld private void codeactivity1_executecode(object sender, EventArgs e) message = "Hello world: " + firstname + " " + LastName; 100

103 Windows Workflow Foundation //Instellen van de boodschap indien de naam is ingevuld private void codeactivity2_executecode(object sender, EventArgs e) message = "Hello, world!"; Code Listing 35: Code van de workflow met de aangepaste ExecuteCode methodes We voorzien een nieuwe string message die we binnen de IfElse structuur opvullen met de gewenste boodschap. In het property venster van de showmessageactiviteit kunnen we deze string dan doorgeven als parameter. Figuur 71: Properties venster van de ShowMessage activiteit Het is ook mogelijk om deze nieuwe activiteit buiten dit project te gebruiken. Hiervoor moeten we dit project compileren naar een library en dan kunnen we in een nieuw project hier een reference naar maken en deze activiteit gebruiken Voorwaarden en regels De processen die in een workflow worden vastgelegd zijn meestal een weergave van de business regels die binnen een bedrijf gehanteerd worden. Het correct omgaan met deze regels is dus een essentieel onderdeel van de creatie van workflows. Windows Workflow Foundation biedt een aantal mogelijkheden om deze regels op te nemen in de workflow Eenvoudige voorwaarden De eenvoudigste vorm van deze voorwaarden vinden we terug in de IfElse en While activiteiten. De keuze die hier gemaakt wordt is meestal afhankelijk van een bepaalde business regel. Er zijn twee methodes om deze voorwaarde vast te leggen. De eerste hiervan is een code condition. Hierbij schrijft de ontwikkelaar een methode die de juiste data evalueert en een boolean teruggeeft. Wanneer de voorwaarde moet gecontroleerd worden roept de workflow deze methode op en gebruikt het resultaat ervan. 101

104 Windows Workflow Foundation De andere oplossing is een rule condition. Deze kan ook in code aangemaakt worden maar ook met een tool, de Rule condition editor. Deze regels worden in XML formaat opgeslagen in een aparte file. Ook hier wordt bij het bereiken van de voorwaarde deze regel geëvalueerd en wordt een logische waarde teruggegeven. Het voordeel van deze rule condition is dat deze ook tijdens het uitvoeren van de workflow nog kan gewijzigd worden. Daarnaast is dit ook de ideale manier om ervoor te zorgen dat business regels maar op één plaats voorkomen en dus eenvoudig te onderhouden zijn. Deze rule conditions kunnen namelijk hergebruikt worden in andere activiteiten binnen dezelfde workflow Voorwaarden en activiteiten groeperen De IfElse en While activiteiten die hierboven besproken worden bieden een eenvoudige en duidelijke manier aan om het verloop binnen de workflow te sturen. Voor dynamische scenario s, zoals workflows met gebruikersinteractie, kan de Conditioned Activity Group (CAG) beter geschikt zijn. Deze CAG activiteit bevat andere activiteiten, elk met een bijhorende when condition. Deze voorwaarde kan vastgelegd worden als een code condition of een rule condition, net als bij de eenvoudig voorwaarden. Bij het bereiken van zo een CAG tijdens het uitvoeren van een workflow worden al deze voorwaarden geëvalueerd. Bij elke voorwaarde die positief evalueert wordt de bijhorende activiteit uitgevoerd. Deze activiteiten kunnen natuurlijk ook op hun beurt samengestelde activiteiten zijn waardoor een zeer complexe structuur opgebouwd worden binnen deze CAG. Alle activiteiten binnen de CAG worden parallel uitgevoerd en zodra er één voltooid is wordt de voorwaarde van alle andere activiteiten die niet uitgevoerd worden opnieuw geëvalueerd. Opnieuw worden alle voorwaarden die positief geëvalueerd worden uitgevoerd. Deze cyclus, dus het controleren van voorwaarden en het uitvoeren van de bijhorende activiteiten, blijft doorgaan zolang er voorwaarden een positieve waarde opleveren of tot een until condition wordt bereikt, die bij de CAG kan worden ingesteld. Deze CAG kan gezien worden als een mini-workflow, waar het verloop volledig gestuurd wordt door business rules. Een gelijkaardige functionaliteit kan men terugvinden bij het gebruik van een rules engine, dewelke in de volgende paragraaf terug te vinden is Rules engine De vorige methoden zijn zeker interessant om kleine tot middelgrote groepen van voorwaarden in de workflow weer te geven. Voor een complexe en uitgebreide verzameling van business rules kan dit echter een moeilijke opdracht blijken. Een betere oplossing kan hier het gebruik zijn van een rules engine. Windows Worfklow Foundation biedt dit aan onder de vorm van de Policiy activiteit. Binnen deze activiteit kan een ontwikkelaar een rule set definiëren. Elke regel is van de vorm IF <voorwaarde> THEN <action> ELSE <action>. Bij het gebruiken van deze policy activiteit binnen een workflow zal de rules engine bepalen aan welke van deze voorwaarden voldaan wordt en vervolgens de overeenkomstige activiteiten uitvoeren. Deze activiteiten kunnen er op hun beurt voor zorgen dat andere regels in de rule set nu ook moeten uitgevoerd worden. Om 102

105 Windows Workflow Foundation dit te ondersteunen zal de rules engine de regels die beïnvloedt worden door een activiteit opnieuw evalueren en indien nodig de bijhorende activiteiten uitvoeren. Dit systeem wordt forward chaining genoemd. Dit proces blijft zich herhalen tot geen enkele activiteit nog moet uitgevoerd worden of tot een bepaalde limiet is bereikt Uitvoeren van een Workflow Bij het uitvoeren van een workflow wordt gebruik gemaakt van de Windows Workflow Foundation runtime engine. Deze zorgt ervoor dat workflows gestart worden en dat hun status doorheen hun levensloop wordt bijgehouden. Deze runtime engine moeten we echter zien als een bibliotheek met de mogelijkheden om dit te doen maar om dit in de praktijk te brengen is er een host proces nodig. Een deel van de opzet bij het creëren van WF is de flexibiliteit bij het inzetten van workflows. Een belangrijk aspect om dit te bekomen is ervoor zorgen dat een ontwikkelaar niet vastzit aan één zo een host proces om de workflow runtime engine in te hosten maar dat hij hier vrij in kan kiezen. Het is dan ook mogelijk om zo goed als elk Windows proces te gebruiken om deze runtime in te hosten. Zowel console applicaties, Windows Forms applicaties als speciaal ontwikkelde servers kunnen dit dus doen, al naargelang de noden van de applicatie. Daarnaast is het al mogelijk om in Microsoft Office SharePoint Services workflows te hosten en zal dit ook in de volgende versies van BizTalk Server beschikbaar zijn. Het is natuurlijk zo dat verschillende hosts verschillende eigenschappen bezitten. Net zoals bij andere software is het moeilijker om een lokaal geïnstalleerde applicatie te onderhouden dan om een webapplicatie up-to-date te houden. Maar ook dit maakt een deel uit van de flexibiliteit van het framework waar iedere ontwikkelaar vrij is om te kiezen wat voor hem het beste lijkt. Daarnaast is het niet alleen de runtime engine die bepaalt wat mogelijk is binnen de host. Zoals eerder al aangehaald werd is het de verantwoordelijkheid van het host proces om een aantal services aan te bieden die dan door de workflow engine zullen gebruikt worden. Zoals meestal levert Microsoft een aantal standaard oplossingen voor deze services maar het staat de gebruiker van WF vrij om deze aan te passen of zelfs volledig te herschrijven om betere resultaten te behalen. Een ASP.Net Host voor een workflow runtime engine zal bijvoorbeeld standaard gebruik maken van SQL Server voor de persistentie van workflows maar deze persistence service kan evengoed vervangen worden door een zelfgeschreven service die gebruikt maakt van een ander databasesysteem dat binnen een bedrijf gebruikt wordt. Ook dit draagt bij aan de filosofie dat het framework volledig af te stemmen is op zeer unieke vereisten binnen een applicatie. Zoals we voor alle eerdere onderdelen gezien hebben is de runtime dus opnieuw een klasse waar een object van gecreëerd wordt. Dit maakt het dus mogelijk om deze vanuit vele soorten Windows processen te gebruiken. 103

106 Windows Workflow Foundation Levensloop van een Workflow Binnen de Windows Workflow Foundation zijn er een aantal activiteiten en methodes voorzien bij de WorkflowInstance klasse die het mogelijk maken om de toestanden en de levensloop van een workflow te controleren. In het volgende onderdelen bekijken we de verschillende toestanden, de events die erbij horen en de overgangen tussen de verschillende toestanden Persistence Points Vooraf is het belangrijk om te beseffen dat workflow meestal gedurende een lange tijd in uitvoering zijn. Aangezien het praktisch niet interessant is om deze workflows continu in het geheugen te houden is het aangewezen dat de toestand van een workflow persistent kan gemaakt worden, tot het event waar de workflow op wacht zich voordoet. Daarnaast heeft een persistente tussentoestand ook het voordeel dat bij een fout op een later tijdstip de workflow kan hervat worden vanaf het laatste persistentie punt. Bij het ontbreken van een persistentie service zal het volledige werk van de workflow verloren gaan. Indien een WorkflowPersistenceService aanwezig is (en dus aan de WorkflowRuntime is toegevoegd), zal de workflow runtime engine deze gebruiken om de workflow toestand naar een opslagmedium weg te schrijven. Dit kan voorkomen op een aantal punten: Bij het beëindigen van een activiteit die een PersistOnCloseAttribute bevat (bv. TransactionScope activiteiten) Voor de workflow instance completion Voor de workflow instance termination Bij het idle worden van de workflow Wanneer WorkflowInstance.Unload() of WorkflowInstance.TryUnload() worden opgeroepen Bij het persistent maken roept de WF runtime engine de SaveWorkflowInstanceState() op van de WorkflowPersistenceService. Bij het opnieuw ophalen van een workflow wordt de LoadWorkflowInstanceState() methode opgeroepen. De workflow runtime is verantwoordelijk voor de tijdstippen waarop de persistentie wordt opgeroepen terwijl de persistence services zorgen voor het effectief opslaan en opnieuw ophalen van de workflow gegevens. Bij het opslaan worden de toestanden van de activiteiten samen met de workflow instance ID geserialiseerd en opgeslagen. Daarnaast wordt alle andere informatie die nodig is om de workflow te kunnen hervatten (zoals queues) mee geserialiseerd en opgeslagen Workflow Instance Events Op elk moment bevindt een workflow instance zich in één van de volgende toestanden: Created, Running, Suspended, Completed of Terminated. Daarnaast zijn er 13 events die doorheen de levenscyclus van een workflow instance kunnen voorkomen. Deze events kunnen weergeven dat een workflow instance naar een andere toestand is overgegaan Het 104

107 Windows Workflow Foundation WorkflowCompleted event geeft bijvoorbeeld aan dat een workflow instance overgegaan is van de Running naar de Completed toestand. Er zijn echter ook events die niet aantonen dat er een verandering van toestand is. Het WorkflowPersisted event geeft namelijk aan dat de workflow instance persistent gemaakt werd maar de workflow instance bevindt zich nog steeds in de Running toestand. Van die 13 events worden er 11 naar de host applicatie doorgegeven via runtime events en tracking workflow events. De overige 2 worden enkel via tracking workflow events doorgegeven. Zoals gezegd bevat WF een aantal methoden in de WorkflowInstance klasse die het de host applicatie mogelijk maken om de levensloop van de workflow instances te beheren. Daarnaast kan deze applicatie een aantal policies instellen om deze workflow instances te beheren. Zo is het bijvoorbeeld mogelijk om een unload policy op te stellen die bepaalt wanneer de WF engine de workflow instance persistent moet maken. Ook kan de applicatie aan de hand van bijvoorbeeld de Suspend activiteit en de Terminate activiteit de toestand van een workflow instance beïnvloeden. In de volgende onderdelen komen de verschillende events en de overgangen tussen toestanden aan bod. WorkflowAborted Een workflow instance wordt beschouwd als aborted wanneer de workflow runtime engine de workflow instance uit het geheugen verwijdert. Een host applicatie kan dit doen door de methode WorkflowInstance.Abort() op te roepen. Workflow instances die eerder aborted werden kunnen hervat worden vanaf hun laatste persistence Point door WorkflowInstance.Resume() te gebruiken. Een abort wordt enkel gebruikt in extreme gevallen waarbij de applicatie alle werk sinds een persistence point besluit te verwijderen. WorkflowCompleted Een workflow instance is completed wanneer de workflow instance zijn uitvoering heeft beëindigd. Op dat moment kan de host applicatie de queues doorzoeken naar berichten en ander events die niet door de workflow instance werden gebruikt. WorkflowCreated Een workflow instance die volledig is opgebouwd maar waarvan nog geen activiteiten gestart zijn bevindt zich in de created toestand. Het creëren van zo een workflow instance gebeurt door één van de overladen methoden WorkflowRuntime.CreateWorkflow() aan te roepen. WorkflowIdled Een workflow instance die wacht op een extern event (een timer, bericht of andere custom event) vooraleer hij verder uitgevoerd wordt is idle. Om system resources te sparen kan een applicatie zijn unload policy instellen zodat een idle workflow instance automatisch uit het geheugen gehaald wordt. Indien de host applicatie gebruik maakt van de standaard SqlWorkflowPersistenceService, dan kan de UnloadOnIdle vlag in de applicatie configuratie gezet worden zodat de WF runtime engine de workflow instance toestand persistent zal maken wanneer deze idle wordt. 105

108 Windows Workflow Foundation WorkflowLoaded Op het moment dat een workflow instance vanaf een persistent medium opnieuw in het geheugen wordt geladen wordt het loaded event opgeroepen. WorkflowPersisted Wanneer een standaard SqlWorkflowPersistenceService of een zelfgeschreven persistence service aan de workflow runtime is toegevoegd wordt dit event opgeroepen bij het wegschrijven van de toestand van de workflow instance. WorkflowResumed Een workflow instance is resumed wanneer WorkflowInstance.Resume() wordt opgeroepen op een suspended of aborted workflow instance. WorkflowStarted Het WorkflowStarted event komt voor bij het oproepen van de WorkflowInstance.Start() methode. Dit gebeurt net voor de workflow runtime engine start met het uitvoeren van de activiteiten. WorkflowSuspended Een workflow instance wordt suspended door het gebruiken van de WorkflowInstance.Suspend() methode of door de uitvoering van een Suspend activiteit. Het resultaat is dat de workflow instance overgaat naar de Suspended toestand. WorkflowTerminated Vergelijkbaar met het vorige event wordt een workflow instance terminated door WorkflowInstance.Terminate() op te roepen of als gevolg van een Terminate activteit. Daarnaast komt het ook voor wanneer een unhandled exception voorkomt tijdens de uitvoering van de worfklow. Na dit event bevindt de workflow instance zich in de Terminated toestand. WorkflowUnloaded Het WorkflowUnloaded event komt voor wanneer een workflow instance uit het geheugen gehaald wordt en naar een persistent medium wordt weggeschreven. Dit kan een gevolg zijn van de persistence policy of door het oproepen van WorkflowInstance.Unload() of WorkflowInstance.TryUnload() Workflow Instance Events Transitions Al de voorgaande events worden door de workflow instances naar de host gestuurd via workflow runtime events en tracking workflow events. De host applicatie kan zich inschrijven op deze runtime events of gebruik maken van een tracking service om ervan op de hoogte te blijven. Exception en Changed events worden enkel via de tracking service naar de host gecommuniceerd. Een Exception event geeft aan dat er tijdens de uitvoering een fout 106

109 Windows Workflow Foundation opgetreden is. Een Changed event laat de host weten dat de workflow instance dynamisch geupdated werd tijdens de uitvoering. De volgende figuur toont de verschillende toestanden en de overgangen ertussen. Indien een persistence service beschikbaar is zullen ook de persistence Points voorkomen zoals op de figuur getooond. Binnen de host applicatie kunnen dus ook de WorkflowPersisted, WorkflowUnloaded en de WorkflowLoaded events voorkomen. Indien een workflow instance zich niet in het geheugen bevindt en een persistence service is beschikbaar, dan zullen operaties op de workflow instance (zoals Resume, Abort, Terminate) als gevolg hebben dat de workflow instance eerst vanop het persistent medium geladen wordt en dat dan de operatie wordt uitgevoerd. 107

110 Windows Workflow Foundation Figuur 72: Overzicht van alle toestanden waarin een workflow zich kan bevinden 108

111 Windows Workflow Foundation Workflow Instance Operations Zoals eerder vermeld heeft de WorkflowInstance klasse een aantal methoden die de levensloop van een workflow instance beheren: WorkflowInstance.Start() Deze methode start de uitvoering van een gecreëerde workflow instance. Hierbij wordt het WorkflowStarted event gegenereerd en gaat de workflow instance over naar de Running toestand. Indien Start() op een reeds gestarte workflow instance wordt uitgevoerd zal een InvalidOperationException optreden. WorkflowInstance.Abort() Abort zorgt voor een abort van de workflow instance. Indien succesvol treedt het WorkflowAborted event op. WorkflowInstance.Load() Hiermee wordt een workflow instance die persistent gemaakt was terug in het geheugen gehaald. De workflow instance wordt vervolgens gepland voor uitvoering vanaf de toestand net voor het persistent maken. Na het succesvol laden komt een WorkflowLoaded event. WorkflowInstance.Resume() Met Resume() wordt een suspended of aborted workflow instance hervat. Net voor het verdergaan met de uitvoering van de workflow instance wordt een WorkflowResumed event gegenereerd. WorkflowInstance.Suspend() Zorgt voor een suspend van de workflow instance. Bij een succesvolle oproep van deze methode treedt een WorkflowSuspend event op. WorkflowInstance.Terminate() Beëindigt de workflow instance en verwijdert de workflow instance uit het geheugen. De workflow runtime laat de geregistreerde persistence service weten dat de workflow instance uit het geheugen is gehaald. Bij de SqlWorkflowPersistenceService betekent dit ook dat alle toestandsinformatie over de workflow instance uit de database wordt verwijderd. Vanaf hier is het dan ook niet meer mogelijk om de workflow instance opnieuw te laden vanaf het laatste persistence point. Na het succesvol beëindigen van de methode wordt een WorkflowTerminated event gegenereerd. WorkflowInstance.Unload() Deze methode haalt de workflow instance uit het geheugen en zorgt ervoor dat deze persistent gemaakt wordt. De methode is gesynchroniseerd, ze blokkeert zolang het huidig geplande werk niet beëindigd is of tot het einde van een transaction scope bereikt wordt, zodat het mogelijk 109

112 Windows Workflow Foundation wordt om correcte gegevens weg te schrijven. Na het succesvol unloaden treedt een WorkflowUnloaded event op. Indien de Unload() methode opgeroepen wordt op een workflow instance waarbij geen persistence service is geregistreerd wordt een InvalidOperationException gegenereerd. WorkflowInstance.TryUnload() In tegenstelling tot de vorige methode zal TryUnload() de workflow instance niet blokkeren tot deze kan weggeschreven worden. Deze methode zal de workflow instance proberen weg te schrijven naar een persistent medium en geeft true terug indien de workflow instance suspended of idle is. Anders wordt false teruggegeven. Ook hier wordt bij het ontbreken van een persistence service een InvalidOperationException opgeroepen Tracking Doordat workflows op een transparante manier opgebouwd zijn is het mogelijk om op een vaste manier het verloop te volgen. De workflow bestaat namelijk uit een aantal gebeurtenissen, zoals het starten en beëindigen van de workflow, het uitvoeren en stoppen van een activiteit of gebruikersevents, die mekaar opvolgen. Het kan dan ook interessant zijn om al deze events bij te houden, om op elk moment te weten in welke toestand de workflow zich bevindt of om er later de statistieken van te bekijken om verbeteringen aan te brengen in het systeem. De informatie die bijgehouden wordt is bepaald in een tracking profile, waarvan er standaard één voorzien is, de SqlTrackingService, maar welke door ontwikkelaars kunnen bijgemaakt worden. Standaard zal deze informatie dan naar een SQL Server weggeschreven worden maar ook dit is aan te passen aangezien de tracking service in de host applicatie kan ingesteld worden. Het is ook mogelijk om meerdere tracking services te draaien en zo op verschillende plaatsten informatie bij te houden. Bij de SqlTrackingService wordt alle data bijgehouden in een tabel in een database op een SQL Server. Om deze data op te vragen moeten dan enkel een aantal query s uitgevoerd worden Persistence Bij het implementeren van workflow scenario s met de Windows Workflow Foundation wordt al snel duidelijk dat sommige workflows meerdere uren of dagen zullen nodig hebben om tot een eindtoestand te komen. Van zodra er gebruikersinteractie verwacht wordt is het namelijk niet zeker dat de gewenste persoon op dat ogenblik aanwezig is of net met de applicatie aan het werken is. Het is dan ook een gevaarlijke keuze om al deze workflows in het geheugen te houden. Er is nood aan een manier om de toestand van workflows naar een persistent medium weg te schrijven. Dit is namelijk een manier om geheugen vrij te maken op de server waardoor deze meer workflows draaiende kan hebben op een bepaald moment. Daarnaast maakt het het workflowsysteem ook los van een standaardconfiguratie waar maar één server de workflows kan uitvoeren. Indien deze op een dataserver persistent worden gemaakt, dan kunnen 110

113 Windows Workflow Foundation meerdere servers deze hervatten uit deze toestand. Als laatste is ook mogelijk om workflows te hervatten uit een vorige toestand bij een fout op de server. Net zoals bij de Tracking service is er voor de Persistence service ook een standaardimplementatie voorzien onder de vorm van de SqlWorkflowPersistenceService. Ook deze maakt gebruik van een SQL Server. Om hiervan gebruik te maken moet een nieuwe database gemaakt worden met een script dat wordt geïnstalleerd samen met.net 3.0. Vervolgens moet er een persistence service gecreëerd worden in de host applicatie en eraan toegevoegd worden. Naast de persistence service moet ook de Unload policy ingesteld worden. Deze policy bepaalt wanneer een workflow naar het persistent medium zal worden weggeschreven. Dit kan gebeuren na het beëindigen van een transactie of een compenseerbare sequence, bij het idle worden van een activiteit, bij het stoppen van een activiteit of een workflow en wanneer er vanuit code expliciet om gevraagd wordt. Naast deze standaardservice is er ook de mogelijkheid om zelf een persistence service te ontwikkelen waarbij kan ingesteld worden wanneer er naar het persistent medium wordt geschreven maar vooral ook wat er allemaal wordt weggeschreven Transactions De transaction services zijn aanwezig om te voorzien in de mogelijkheid tot batch verwerking en vooral om de commit handeling aan te passen. Hiermee is het mogelijk om bij het committen van een batch een delegate mee te geven die het effectieve committen zal bevatten. De runtime moet dus nog steeds de commit uitvoeren maar op deze manier is het mogelijk om aanpassingen te maken aan wat de gevolgen hiervan zijn. Het is niet mogelijk om transacties die buiten de workflow gestart werden op te nemen in deze transaction services. Deze ondersteunt enkel de transacties die binnen de workflow gestart zijn. Externe transacties zullen dan ook tijdelijk uit de huidige thread verwijderd worden om eventuele invloed op de uitvoering van de workflow te vermijden. Na het beëindigen van de worfklow worden deze dan opnieuw op de thread geplaatst. Ook hier is er voor een standaardimplementatie gezorgd die eventueel kan vervangen worden door een eigen service. De DefaultWorkflowCommitWorkBatchService wordt standaard door de workflow runtime gebruikt en wordt automatisch toegevoegd indien geen andere transaction service gebruikt wordt. Deze service voorziet in aparte.net Framework transacties voor elke database connectie. Een SQLTrackingService en een SQLPersistenceService zullen dus geen connecties delen. Bij het gebruik van de SharedConnectionWorkflowCommitWorkBatchService zal wel een gedeelde connectie gebruikt worden. Indien dit nodig is binnen de applicatie, dan moet deze service wel expliciet aan de runtime toegevoegd worden. 111

114 Windows Workflow Foundation Timer Bij de Timer service zijn er opnieuw meerdere mogelijkheden. De eerste is de InMemoryTimerService die de timers in het geheugen bijhoudt en zo delay activiteiten kan beheren. Doordat deze timers in het geheugen geplaatst worden zijn ze niet meer bruikbaar na het herstarten van de workflow runtime. De ASPNETTimerService is enkel beschikbaar bij het gebruiken van een ASP.Net applicatie als host. Het beheren van de timers gebeurt hier in het web serverproces en zal de workflow benaderen via een http request. De laatste mogelijkheid is de SqlTimerService die de delay activiteiten beheert vanuit een Sql Server database. Deze manier van werken heeft als voordeel dat zelfs na een system reboot de timers beschikbaar blijven Threading Binnen de Windows Workflow Foundation zijn er standaard twee Threading Services voorzien. De DefaultThreadingService maakt gebruikt van de standaard.net Thread pool om threads toe te wijzen aan de workflow runtime. Daarnaast kunnen workflows met ASP.Net als host ook gebruik maken van de ASPNETThreadingService, die de ASP.Net thread die een http request bedient gebruikt om de workflow uit te voeren WF en andere technologieën Bij het ontwikkelen van WF had Microsoft als doel een workflow framework te ontwikkelen voor het Windows platform. Het is dan ook de bedoeling dat WF ingezet wordt waar mogelijk. De keuze om de Workflow Foundation op te nemen in o.a. BizTalk Server, Microsoft Office SharePoint Services en Microsoft Office is dan ook niet echt verrassend. Hoewel deze applicaties op een specifieke manier omgaan met WF is het toch een mooi voorbeeld van hoe deze toch vrij uiteenlopende programma s met eenzelfde Workflow Foundation elk op hun eigen manier deze workflows kunnen gebruiken. Daarnaast is het natuurlijk ook belangrijk dat WF kan samenwerken met een ander deel van het.net Framework 3.0, de Windows Communication Foundation. Het zal namelijk de bedoeling zijn om alle verschillende manieren van communiceren die nu bestaan te vervangen door deze WCF BizTalk Server Als we kijken in het gamma van Microsoft producten, dan zal BizTalk Server één van de eerste systemen geweest zijn die workflows in software mogelijk maakten, hoewel ze daar eerder als Orchestration bekend staan. BizTalk Server laat ontwikkelaars toe om systeemworkflows te maken voor business process management (BPM), enterprise application integration (EAI) en business-to-business (B2B) integration. Bij het uitbrengen van de opvolger van Microsoft 112

115 Windows Workflow Foundation BizTalk Server 2006 zal deze het gebruiken en aanmaken van Windows Workflow Foundation workflows ondersteunen en dan specifiek voor de eerder genoemde gebieden. Als we deze twee technologieën van dichterbij bekijken zien we een aantal duidelijke gelijkenissen. Voor een ontwikkelaar lijkt de Orchestration Designer binnen BizTalk Server namelijk heel sterk op de Workflow Designer binnen WF. Dit is dan ook geen toeval, aangezien dezelfde mensen binnen Microsoft verantwoordelijk zijn voor deze technologieën. Het is echter niet zo dat BizTalk Server en WF hetzelfde aanbieden. Aan de hand van een aantal richtlijnen is het vrij eenvoudig om in elke situatie de juiste technologie te kiezen. Gebruik Windows Workflow Foundation wanneer: Een applicatie zelf de workflow moet hosten. WF laat toe dat workflows in de applicatie worden ingebouwd, waardoor ze ook beheerd kunnen worden als een deel ervan. BizTalk daarentegen is vooral gericht op het laten samenwerken van diverse applicaties en niet zozeer op het aanbieden van een algemeen workflow framework. BizTalk Server voert zijn Orchestrations dan ook altijd binnen het BizTalk proces uit. Het business process dat wordt geïmplementeerd een menselijke interactie nodig heeft. Binnen BizTalk is het de bedoeling dat systeemworkflows gemodelleerd worden. Er is dan ook geen ondersteuning voor gebruikersinvoer zoals state machine workflows binnen WF. Het is echter wel mogelijk om een complex systeem op te splitsen in verschillende workflows waarvan de ene binnen BizTalk Server wordt gehost en de andere binnen Windows Workflow Foundation. De workflow op een cliënt systeem wordt uitgevoerd. Aangezien BizTalk Server een servergeoriënteerd product is, zoals de naam al doet vermoeden, is het minder geschikt om op een desktop systeem te draaien. Gebruik BizTalk Server wanneer: Een EAI systeem wordt ontwikkeld waarbij communicatie tussen diverse applicaties op diverse platformen nodig is. Dit is namelijk de bedoeling van BizTalk Server en daarvoor is een breed gamma aan adapters beschikbaar die deze communicatie verzorgen. Aangezien Windows Workflow Foundation gericht is op het aanbieden van workflows is deze functionaliteit binnen WF niet aanwezig. B2B services nodig zijn. Ook hier is binnen WF niets voorzien om dit te ondersteunen omdat dit buiten het doel van WF ligt. Opnieuw bezit BizTalk Server de nodige tools om deze software te realiseren. BPM services, zoals Business Activity Monitoring (BAM), nodig zijn. Hoewel de Tracking services binnen WF kunnen gebruikt worden om zo een systeem te creëren, is BizTalk Server toch een betere keuze, aangezien hier een aantal tools beschikbaar zijn die dit een stuk eenvoudiger maken. 113

116 Windows Workflow Foundation Microsoft Office SharePoint Services Microsoft Office SharePoint Services (MOSS 2007), een onderdeel van het Windows Server besturingssysteem, biedt de mogelijkheid om de samenwerking tussen mensen en software te verbeteren. Het ondersteunen van een workflow systeem lijkt dan ook een evidente zaak. De laatste versie van MOSS host dan ook de Windows Workflow Foundation runtime. Door de standaard WF tools te gebruiken, zoals de Workflow Designer, is het voor ontwikkelaars mogelijk om workflow applicaties maken die de samenwerking tussen documenten modeleren. Daarnaast is het hosten van WF binnen MOSS ook de basis voor het workflow systeem in Microsoft Office dat verder aan bod komt K2.Net In tegenstelling tot de andere technologieën in dit onderdeel is K2.Net geen ontwikkeling van Microsoft. De nieuwe versie van dit workflow platform is echter wel gerealiseerd met het.net Framework 3.0 en dus ook de Windows Workflow Foundation en wordt ook de SQL Server 2005 en het Office 2007 pakket ondersteund. De bedoeling van dit pakket is echter heel verschillend van wat Microsoft met WF wil bereiken. De workflow foundation is een technologie die het voor ontwikkelaars mogelijk maakt om workflows op te nemen in hun software en hier dan complexe systemen mee te bouwen. Met WF worden echter enkel workflows gedefinieerd maar geen systeem waar deze workflows op draaien. Dit moet dus ook ontwikkeld worden vooraleer het systeem kan draaien. Zoals in het vorige punt vermeld is de SharePoint Server een mogelijkheid om workflows in te hosten maar deze zijn dan beperkt tot het beheren van de levensweg van documenten. K2.Net wil meer zijn dan dit. We moeten dit product zien als een workflow platform voor Enterprise brede toepassingen waarmee snel en eenvoudig workflows kunnen ontwikkeld worden maar waarbij men zich niet moet bekommeren om het hosten ervan. Hierin vinden we dan ook de ondersteuning voor eindgebruikers die binnen WF ontbreekt. De Windows Workflow Foundation en K2.Net zijn dus twee verschillende producten. Indien een bedrijf geïnteresseerd is in een snelle manier om workflows te gebruiken, zonder te moeten zorgen voor een applicatie die deze ook kan hosten is K2.Net een goede keuze. Indien het echter de bedoeling is om een volledig nieuw systeem uit te bouwen, aangepast aan de individuele behoeften van het bedrijf dan is WF de betere keuze. De keuze situeert zich vooral tussen het gebruiken van een standaardimplementatie, K2.Net, of het zelf ontwikkelen van een systeem met de Windows Workflow Foundation Microsoft Office Hoewel BizTalk Server de eerste applicatie was die workflows ondersteunde, zal de integratie van de Windows Workflow Foundation technologie binnen Microsoft Office evenzeer een belangrijke stap zijn. Office is namelijk de meest gebruikte Windows applicatie, die ondertussen geëvolueerd is van een groep van desktop applicaties tot een combinatie van cliënt- en server technologieën die het Microsoft Office System vormen. Bij het groeien en evolueren van het 114

117 Windows Workflow Foundation systeem zijn de problemen die zich voordoen natuurlijk ook mee gewijzigd. Office 2007, dat gelijktijdig met Windows Vista op de markt is gekomen, beantwoordt aan een deel van deze problemen, door te voorzien in de mogelijkheid om workflows te creëren waarin documenten centraal staan. Het is evident dat ook dit gerealiseerd is met behulp van de Windows Workflow Foundation. Zowel de cliënt- als de serveronderdelen van Office 2007 zullen gebruik maken van de Windows Workflow Foundation en deze uitbreiden. Het is ook de bedoeling dat minder technisch georiënteerde gebruikers document gerichte workflows kunnen maken. Web designers zullen op hun beurt de kans krijgen om op een regelgebaseerde manier te werken ipv de grafische standaardwijze in de Workflow Designer. Daarnaast zullen ook de Office servers een aantal specifieke workflows bevatten om met taken en documenten te werken, samen met een systeem om forms te maken met Microsoft InfoPath. Net als BizTalk Server en Windows SharePoint Server specialiseert Microsoft Office zich in een bepaald aspect van workflows, daar waar de Windows Workflow Foundation zich veel algemener houdt. Alle onderdelen van WF zijn wel aanwezig binnen deze serveronderdelen maar er wordt slechts een beperkte set beschikbaar gesteld naar de gebruikers. Voor Microsoft is het integreren van workflows binnen Office enerzijds een manier om documentprocessen vast te leggen maar zorgt anderzijds ook voor een gekende interface voor deze workflows Windows Communication Foundation Naast Windows Workflow Foundation is Windows Communication Foundation één van de grote onderdelen van het.net Framework 3.0. Zoals eerder te lezen is heeft WCF als bedoeling om een grote groep standaarden voor het creëren van webservices te implementeren en om het voor ontwikkelaars eenvoudiger te maken om applicaties te maken die zowel binnen als buiten de grenzen van de Windowswereld kunnen werken. Het is dan ook niet moeilijk om de kracht van een combinatie van WF en WCF te zien. Waar WCF zich concentreert op het maken van services, kan met WF het business proces dat achter deze service zit geïmplementeerd worden. Hoewel WF ook met de vorige communicatiemethoden als webservices kan werken zal men in de toekomst waarschijnlijk vooral gebruik maken van de mogelijkheden van WCF 2.6. Besluit Het is moeilijk om nu al in te schatten wat het effect van deze Workflow Foundation zal zijn op het softwareontwikkelingsproces. Alles zal natuurlijk afhangen van de wil van ontwikkelaars om naar een nieuwe manier van werken over te stappen. Net zoals bij het invoeren van de Objectgeoriënteerde ontwerptechnieken zal het waarschijnlijk een tijd duren vooraleer deze workflows ingeburgerd zijn. We kunnen wel al kijken of ze aan de vereisten voor een werkbaar workflow systeem hebben voldaan. Zoals vooropgesteld is het een framework geworden dat uit verschillende componenten bestaat. Dit maakt het mogelijk om deze workflows in zeer uiteenlopende situaties in te zetten 115

118 Windows Workflow Foundation en daar volledig af te stemmen op de noden van de applicatie en het bedrijf. Daarnaast is ook voldoende aandacht besteedt aan de grafische weergave van de workflows en de mogelijkheid om deze ook zo te ontwikkelen. Ook het opvolgen van de toestanden van workflows is voorzien, net als het aanpassen van reeds lopende workflows. Al deze onderdelen zijn voorzien maar zijn daarom niet volledig uitgewerkt. De basis is gelegd binnen het framework en er zijn een aantal standaardimplementaties voorzien maar de echte kracht zit in de losse koppeling tussen al deze onderdelen. Hierdoor kunnen softwarebedrijven hun eigen oplossingen creëren voor elk van deze vereisten en zijn ze hierin veel vrijer dan in vorige workflowimplementaties. Dit is echter ook meteen een nadeel aan dit onderdeel van het.net Framework 3.0. Hoewel het voor iedereen mogelijk is om snel te kunnen werken met dit systeem en hiermee een aantal basisworkflows te implementeren, is er toch wat extra moeite nodig om de echte kracht van dit framework te gebruiken. Eenmaal deze drempel echter overwonnen is kunnen de aangepaste services heel gemakkelijk hergebruikt worden. Het is dus een technologie die wel wat tijd zal nodig hebben om goed ingeburgerd te raken maar dewelke een heel gamma aan nieuwe mogelijkheden omvat die zeker door ontwerpers en ontwikkelaars met open armen zullen ontvangen worden. 116

119 Windows Presentation Foundation Hoofdstuk 3 Windows Presentation Foundation Als informatici zijn we vooral geïnteresseerd in technologie. Hoe en waarom een applicatie werkt is meestal veel interessanter dan hoe ze eruitziet en hoe gebruikers er mee omgaan. Het zijn echter deze gebruikers die softwareprojecten mogelijk maken en voor hen is net deze interactie tussen applicatie en gebruiker zeer belangrijk. De user interface van een applicatie bepaalt grotendeels de gebruikservaring ervan, het lijkt alsof deze interface eigenlijk de applicatie is. Het is dan ook een uitdaging voor ontwikkelaars om een goed en snel werkend programma te koppelen aan een gebruiksvriendelijke en aangename interface. Gebruikers verwachten immers steeds dat een applicatie foutloos werkt, het is de gebruikerservaring die ze echt tevreden kan stellen met de geleverde software. Natuurlijk is de standaard voor grafische interfaces doorheen de jaren sterk geëvolueerd. Karaktergebaseerde applicaties doen enkel nog denken aan lang vervlogen tijden en zijn vervangen door grafische interfaces. Met de sterke groei van het internet zijn daar ook alle mogelijke media bij betrokken en verwachten gebruikers een eenvoudige en intuïtieve interface. Om al deze evoluties te kunnen volgen bij het ontwikkelen van nieuwe software is er dan ook een evolutie nodig in de technologie om user interfaces te creëren. De technologie die vandaag meestal gebruikt wordt om grafische interfaces te maken is echter grotendeels gebaseerd op wat mogelijk was in de eerste versies van Windows. Er zijn natuurlijk veel uitbreidingen gekomen sindsdien maar de essentie blijft grotendeels hetzelfde. Daarnaast is ook de hardware sterk geëvolueerd waardoor het mogelijk is om steeds complexere grafische hoogstandjes weer te geven. Hoewel de spelindustrie hier zeer sterk in meegaat en zelfs een drijvende factor is voor het ontwikkelen van nieuwe grafische systemen wordt deze technologie nauwelijks gebruikt bij het ontwikkelen van andere applicaties. We zien echter dat de vraag naar betere grafische ondersteuning binnen applicaties sterk gestegen is. Mede door het internet, waar alles mooi voorgesteld wordt en waar verschillende media vloeiend in elkaar overgaan, verwachten gebruikers een gelijkaardige functionaliteit binnen hun applicaties. Er is dus vraag naar uitgebreide ondersteuning voor afbeeldingen, tekst, 2D en 3D grafieken en audio- en video mogelijkheden. Microsoft wil met WPF (vroeger Avalon) voor een platform zorgen waarop al deze media eenvoudig kunnen gebruikt worden. Ze zijn er zich ook van bewust dat de grafische kant van applicatieontwikkeling meestal niet de sterkste eigenschap is van vele ontwikkelaars. Ze willen er dan ook voor zorgen dat een goede samenwerking mogelijk is tussen deze ontwikkelaars en de ontwerpers van user interfaces. Als laatste zijn ze zich ook bewust van de kracht van het internet en willen dan ook deze nieuwe mogelijkheden niet beperkt zien tot stand-alone 117

120 Windows Presentation Foundation applicaties. De huidige ontwikkeltechnologieën verplichten ons namelijk te kiezen tussen traditionele geïnstalleerde applicaties of online web applicaties. Dit zorgt ervoor dat er keuzes moeten gemaakt worden en dus mogelijkheden verloren gaan die bij de andere technologie vanzelfsprekend zijn. Door deze twee soorten applicaties te laten samengaan kan men van beide werelden de beste mogelijkheden meenemen om betere applicaties te bouwen Presentation Foundation In de volgende onderdelen worden de belangrijkste aspecten van de Windows Presentation Foundation behandeld Verenigd platform voor user interfaces Voor de ontwikkeling van WPF werden gebruikersinterfaces op het Windows platform meestal gemaakt door een combinatie van verschillende technologieën, al naargelang de noden van de applicatie. Tabel 4: Verschillende technologieën voor grafische interfaces Windows PDF Windows Windows Direct3D WPF Forms Forms/G Media DI+ Player Grafische interfaces (vensters en controls) On-screen documenten Fixed-format documenten Afbeeldingen Audio en video 2D graphics 3D graphics Zoals in de tabel te zien is worden voor standaard applicaties de vensters en controls van de Windows Forms gebruikt, een standaard onderdeel van het.net Framework. Als er nood is aan documenten, dan kan dit deels via deze Windows Forms, als het gaat om on-screen documenten. Is er echter nood aan documenten met een vast formaat dan kan bijvoorbeeld Adobe s PDF gebruikt worden. Voor afbeeldingen en 2D graphics is het GDI+ programmeermodel voorzien dat binnen Windows Forms kan gebruikt worden. Voor de verschillende vormen van audio en video zijn we aangewezen op Windows Media Player terwijl 3D graphics gebruik maken van Direct3D. 118

121 Windows Presentation Foundation Als we enkel naar deze tabel kijken dan lijkt dit een zeer complexe en verwarrende situatie. We mogen echter niet vergeten dat dit het gevolg is van een jarenlange evolutie. Om de compatibiliteit met eerder ontwikkelde applicaties niet te verliezen werd er telkens gekozen voor een uitbreiding op de bestaande technologie. Met WPF wil Microsoft een einde maken aan deze manier van werken en opteert nu voor een volledige nieuwe grafische laag binnen het.net Framework. Dit maakt het meteen ook mogelijk om ten volle gebruik te maken van de laatste vernieuwingen in de hardware. Daar zien we namelijk dat het belang van een goede grafische adapter stilaan de nood aan een snelle processor overstijgt. WPF is hierop voorzien en zal zoveel mogelijk gebruik maken van de mogelijkheden van de grafische adapter in een systeem. Een hierbij horende evolutie is ook de overgang van bit-mapped afbeeldingen naar vector afbeeldingen. Dit maakt het mogelijk om een afbeelding te herschalen om zo goed mogelijk te passen op het scherm van de gebruiker en dit zonder kwaliteitsverlies. Opnieuw is dit zeker nodig door de evolutie van schermen waarbij de lijn tussen computermonitor en tv steeds vager wordt. Belangrijk om op te merken is dat WPF niets vervangt. Alle bestaande technologieën blijven beschikbaar. Ontwikkelaars kunnen dus blijven gebruik maken van Windows Forms in omgevingen waar deze beter geschikt zijn. Daarnaast is het ook mogelijk om deze bestaande technologieën te gebruiken binnen WPF. Er kunnen dus ook Windows Forms onderdelen gebruikt worden binnen WPF en de Direct3D technologie wordt zelfs door WPF gebruikt voor alle rendering. Het voordeel van WPF ligt er in dat al deze mogelijkheden nu samengebracht zijn en op een eenvoudigere manier te gebruiken zijn. Doordat alles op een uniforme manier geïmplementeerd kan worden is er ook geen nood meer aan gespecialiseerde kennis van GDI+ of Direct3D. De drempel om mooie en moderne user interfaces te maken is dus duidelijk verlaagd. Daardoor wordt het mogelijk om deze nieuwe mogelijkheden in te zetten om steeds betere interfaces te creëren, wat de kwaliteit van applicaties zeker ten goede komt Vector afbeeldingen Zoals gezegd is het de bedoeling om zoveel mogelijk gebruik te maken van de krachtige grafische processors die tegenwoordig in vele systemen aanwezig zijn. Daarom werkt de engine waarop WPF draait volledig met vectoren. Dit maakt het mogelijk om interfaces eenvoudig en zonder kwaliteitsverlies aan te passen aan de resolutie waarop ze draaien. De architectuur gebruikt daarbij Direct3D voor alle uitvoer. Hierdoor kunnen video kaarten die DirectX 7 of later ondersteunen ingeschakeld worden bij het renderen van de interfaces. Indien de videokaarten niet volstaan zal er overgeschakeld worden op een software rendering. Er is ook ondersteuning voor nieuwere technologieën, zoals een floating point logisch pixel systeem en 32-bit ARBG kleur ondersteuning, wat nodig zal zijn voor schermen met een hoge DPI. 119

122 Windows Presentation Foundation Samenwerking tussen ontwerpers en ontwikkelaars Naast de beschikbaarheid van al deze verschillende technologieën blijft natuurlijk de uitdaging om er een begrijpbare en eenvoudig te gebruiken user interface mee te maken. En als we eerlijk zijn moeten we toegeven dat niet alle softwareontwikkelaars hier even bedreven in zijn. Door alle nieuwe mogelijkheden wordt het dan ook steeds belangrijker om ontwerpers in te schakelen binnen softwareteams, die voor een goede interface kunnen zorgen, terwijl de programmeurs zorgen voor de functionaliteit erachter. Met de huidige technologie levert dit wat problemen. Een ontwerper start meestal in een grafische applicatie met het schetsen van de verschillende schermen. Vervolgens is het aan de ontwikkelaar om met deze schetsen een applicatie te maken die er net zo uit ziet en de mogelijkheden ervan implementeert. De moeilijkheid zit er echter in dat een ontwerper niet gebonden is door de mogelijkheden van een ontwikkelplatform. Zijn creativiteit kan het voor een ontwikkelaar dan ook moeilijk of zelfs onmogelijk maken om deze schetsen in werkende software om te zetten. Bij het overgaan van schetsen naar programma s moeten dus al te veel compromissen gesloten worden waardoor soms ver moet afgeweken worden van de visie van zowel de ontwerper als de ontwikkelaar. Dit komt de kwaliteit van de interface natuurlijk niet ten goede. Er is dus nood aan een manier om deze disciplines beter te laten samenwerken om zo betere interfaces te realiseren. Om dit mogelijk te maken wordt binnen WPF de extensible Application Markup Language (XAML) geïntroduceerd. Het is een afgeleide van XML met elementen zoals Button, TextBox, Label, allerlei elementen die het uitzicht van een interface kunnen bepalen. Net als bij XML zijn er bij deze elementen ook attributen mogelijk, die eigenschappen van het element definiëren, zoals de kleur van een knop. Elk element van de XAML specificatie komt overeen met een WPF klasse waarin alle attributen voorkomen als property of event. Alle XAML code kan dus ook als C# code geschreven worden, of in elke andere taal die door.net ondersteund wordt. Wat is nu het nut van deze nieuwe taal? Binnen WPF wordt deze gebruikt voor de communicatie tussen ontwerpers en ontwikkelaars. Het is namelijk zo dat tools die XML gebaseerde beschrijvingen genereren eenvoudiger te maken zijn dan wanneer ze code moeten genereren. Dit maakt het dus eenvoudiger om de gebruikte software met dezelfde informatie te laten werken. In de praktijk zullen ontwerpers in een designer omgeving willen werken. Daarvoor heeft Microsoft het Expression pakket ontwikkeld. Binnen deze applicatie kan een ontwerper een grafische interface ontwerpen op een vertrouwde manier. Hij zal hier niet lastig gevallen worden met de code die er later kan bijgevoegd worden. Zijn werk zal opgeslagen worden als een XAML beschrijving van de interface. 120

123 Windows Presentation Foundation De ontwikkelaar kan dan deze beschrijving vervolgens inlezen in Visual Studio. Deze zal ervoor zorgen dat de interface beschikbaar is zoals de ontwerper deze gemaakt heeft. Hij kan dan de nodige code schrijven om de interface functionaliteit te geven. Het voordeel van deze manier van werken is dat de vertaling van schetsen naar een applicatie niet meer hoeft te gebeuren. Er zullen dus minder misverstanden zijn tussen de ontwerpers en ontwikkelaars. Daarnaast is het mogelijk om deze XAML bestanden meerdere malen tussen ontwerper en ontwikkelaar uit te wisselen om zo elke keer de interface te verfijnen en verder uit te werken. Het maakt het ook mogelijk om parallel te werken wat voor snellere iteraties kan zorgen en betere feedback. Het gebruik van XAML kan dus het maken van grafische user interfaces ingrijpend veranderen, op voorwaarde dat ontwerpers een belangrijke rol gaan spelen bij het ontwikkelen ervan Gemeenschappelijke technologie voor Windows en Browser applicaties Tot nu toe hebben we het enkel gehad over het ontwikkelen van applicaties voor het Windows platform. De realiteit is echter dat door de sterke groei van het internet de markt voor webapplicaties minstens even belangrijk is geworden. Wat al deze webapplicaties gemeen hebben is dat ze binnen een browser worden weergegeven. Dat kan een eenvoudige HTML pagina zijn, eventueel met wat JavaScript. Nieuwere ontwikkelingen zorgen voor asynchrone JavaScript en XML (AJAX). Er kunnen eveneens animaties, muziek en video afgespeeld worden door bijvoorbeeld Adobe s Flash Player. Al deze zaken zorgen ervoor dat web applicaties aantrekkelijker worden voor gebruikers en dus meer gebruikt worden. Bij het ontwikkelen komen opnieuw een verzameling van technologieën aan bod, verschillend van deze bij het ontwikkelen van Windows applicaties maar met dezelfde problematiek: er is geen uniforme oplossing. Daarnaast zagen we ook dat ontwikkelaars zich ofwel in Windows applicaties specialiseerden of zich toespitsten op webapplicaties. Als we echter kijken naar wat uitgebreide webapplicaties aanbieden zien we dat dit een weinig verschilt van wat gebruikers van hedendaagse Windows applicaties verwachten. WPF wil dan ook zorgen voor dezelfde mogelijkheden in een browser als bij gewone applicaties. Daarom kan een ontwikkelaar een XAML Browser Application (XBAP) maken met WPF. Deze applicatie kan dan uitgevoerd worden binnen Internet Explorer. Het belangrijke is dat de code die we gebruiken om deze XBAP te definiëren evengoed voor een stand-alone applicatie kan gebruikt worden. Dit zorgt ervoor dat meteen zo goed als alle mogelijkheden voor moderne interfaces binnen de browser beschikbaar zijn. Daarnaast moet de code maar één maal geschreven worden voor applicaties die op verschillende manieren beschikbaar gesteld 121

124 Windows Presentation Foundation worden. Ontwikkelaars moeten dus niet meer kiezen voor het Windows platform of het Web, ze kunnen hier probleemloos tussen schakelen. Een belangrijk verschil tussen de uitvoering van een stand-alone applicatie en een XBAP zien we wel bij de beveiligingsvoorwaarden. Een XBAP wordt namelijk uitgevoerd binnen een security sandbox die beschikbaar is door het.net Framework binnen de code access security. Daarnaast is een systeem vereist dat WPF geïnstalleerd heeft en beschikt over Internet Explorer versie 6 of hoger. Het is ook de bedoeling om andere veelgebruikte browsers van andere producenten te ondersteunen. Eens hieraan voldaan is kunnen browser applicaties dezelfde functionaliteit bevatten als gewone Windows applicaties Gebruik van WPF Nu we weten wat de bedoeling is van WPF kunnen we kijken hoe dit gerealiseerd werd en hoe dit kan toegepast worden om betere interfaces te creëren. Hoewel WPF opgevat werd als een platform waarbinnen op een uniforme manier uiteenlopende interfaces kunnen gerealiseerd worden, kunnen we dit toch opsplitsen in een aantal essentiële onderdelen, zoals tekst, documenten, afbeeldingen en animaties. Ze hebben echter allemaal het application model gemeen dat hierna besproken wordt Applicatie model Zoals bij alle onderdelen van het.net Framework is de functionaliteit van WPF te vinden in een groep van namespaces, ondergebracht binnen de System.Windows namespace. Daarnaast is de structuur van elke WPF applicatie zeer gelijklopend, onafhankelijk van welke functionaliteit gebruikt wordt of de manier waarop de applicatie aan de gebruikers wordt aangeboden. Het beginpunt van een WPF applicatie is de overerving van de standaard WPF klasse Application. Deze klasse voorziet in een aantal standaard services die elke applicatie kan gebruiken. Hieronder kunnen we de Run en Shutdown methode vinden om een applicatie te starten en te stoppen maar ook de holding state die beschikbaar moet zijn voor de volledige applicatie. Zoals eerder gezegd kan een WPF applicatie gedefinieerd worden in XAML of in code, dit zien we dan ook door het gebruik van respectievelijk een Application element of de Application klasse. Natuurlijk zal een applicatie in de praktijk meestal bestaan uit een combinatie van deze twee mogelijkheden. <Application x:class="testwpf.app" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> <Application.Resources> </Application.Resources> </Application> Code Listing 36: XAML code die een WPF applicatie definieert 122

125 Windows Presentation Foundation In deze code zien we het Class attribuut waarmee verwezen wordt naar de klasse die de code bevat die bij deze applicatie hoort. Daarna volgt de specificatie van de WPF namespace die als default voor dit element gebruikt wordt, samen met de definitie van een prefix voor de XAML namespace. XAML wordt namelijk voor meer gebruikt dan WPF alleen dus deze twee namespaces zijn niet dezelfde. Als laatste wordt de naam van de XAML pagina die als eerste moet getoond worden vastgelegd in het StartupUri attribuut. Er is binnen het Application element ook een leeg element voorzien waar de Resources van de applicatie kunnen gespecifieerd worden. We zien dus dat alle WPF applicaties op eenzelfde klasse voortbouwen. Dit wil echter niet zeggen dat alles daarmee vastgelegd is, er zijn namelijk nog veel keuzes te maken tijdens de ontwikkeling. Een belangrijke keuze is tussen een dialooggestuurde interface of een navigatiegestuurde interface. Bij de dialooggestuurde interface kunnen we ons een standaard Windows applicatie voorstellen waar de standaard knoppen en dergelijke elementen voorkomen. Bij een navigatiegestuurde interface denken we eerder aan applicaties die zich gedragen als een browser. In plaats van een nieuw venster te openen voor een dialoog zal een nieuwe pagina geladen worden. Deze interfaces worden dan ook geïmplementeerd als een groep pagina s, die elk bestaan uit een user interface die in XAML gedefinieerd is, samen met de logica die er achter zit die in code is gedefinieerd. Net zoals bij HTML pagina s vinden we binnen XAML een Hyperlink element dat al die pagina s kan samenbrengen. Gebruikers zullen dan door de pagina s navigeren zoals bij een Webgebaseerde applicatie, waarbij ze ook gebruik kunnen maken van een historiek om vooruit en terug te gaan. Het blijft echter een Windows applicatie. Hoewel we deze soort applicaties eerder zullen terugvinden als XBAP kunnen ze perfect als stand-alone Windows applicatie geïmplementeerd worden. Die keuze ligt volledig bij de ontwikkelaar en is natuurlijk gebaseerd op de noden en wensen van de gebruikers. Welke stijl van applicatie ook gekozen wordt, meestal worden meerdere vensters getoond. Binnen WPF zijn er opnieuw een aantal keuzes. De eenvoudige Window klasse voorziet in de standaard mogelijkheden zoals het tonen, verbergen en sluiten van het venster. Voor applicaties die geen navigatiegestuurde interface hebben volstaat dit. Het NavigationWindow is een betere keuze voor navigatiegestuurde interfaces. We vinden hier een Navigate methode die de applicatie toelaat om een nieuwe pagina weer te geven, een logboek dat de navigatie historiek bijhoudt van een gebruiker alsook een aantal events die voorkomen bij deze navigatie. <Window x:class="testwpf.window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWPF" Height="300" Width="300"> </Window> Code Listing 37: XAML code voor een Window 123

126 Windows Presentation Foundation In deze code zien we opnieuw de namespaces, samen met de titel van het venster en de afmetingen ervan. Alle elementen die we later toevoegen zullen binnen dit Window element geplaatst worden Layout en controls Om de layout van een interface te kunnen organiseren gebruikt WPF verschillende panels. Binnen zo een panel kunnen kinderen voorkomen. Dit kunnen controls zijn, zoals knoppen of tekstvelden, of andere panels. De verschillende soorten panels hebben elk hun layoutmogelijkheden. Een DockPanel maakt het mogelijk om zijn kinderen te positioneren langs de randen van het panel, de exacte positie is dus niet van belang. Een Grid laat toe om zijn kinderen precies te positioneren op een grid, zoals de naam al laat vermoeden. De ontwikkelaar bepaalt hier het aantal rijen en kolommen en plaatst dan de controls in de juiste cel. Een StackPanel plaatst de inhoud van links naar rechts of van boven naar onder. Met een WrapPanel worden de elementen op een rij geplaatst, van zodra deze vol is wordt een nieuwe rij gestart. Een Canvas laat toe dat kinderen vrij geplaatst worden binnen de grenzen van het panel. Belangrijk om weten is dat elementen op een interface de grootte aannemen van wat ze bevatten. Dit zorgt ervoor dat alle informatie altijd zichtbaar blijft. Door het combineren van panels en uitlijning kunnen we er dan voor zorgen dat de plaats verdeeld wordt zoals wij dat willen. Naast deze panels beschikt WPF net als vorige technologieën over een grote verzameling standaard controls die volstaan om standaardapplicaties te realiseren. Het is natuurlijk nog steeds mogelijk om zelf controls te creëren. Net zoals bij andere technologieën om grafische interfaces te creëren worden events gebruikt om interactie met de gebruiker mogelijk te maken. Waar we zien dat controls en andere elementen van de interface volledig in XAML kunnen worden gedefinieerd, blijven we voor de event handlers aangewezen op code. <Window x:class="testwpf.window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWPF" Height="150" Width="450"> <DockPanel> <Label DockPanel.Dock="Top">Titel van de pagina</label> <Grid DockPanel.Dock="Bottom" HorizontalAlignment="Right" Width ="200"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"></ColumnDefinition> <ColumnDefinition Width="10"></ColumnDefinition> <ColumnDefinition Width="1*"></ColumnDefinition> </Grid.ColumnDefinitions> <Button Grid.Column="0" Click="Ok_Click">Ok</Button> <Button Grid.Column="2" Click="Annuleer_Click">Annuleer</Button> </Grid> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"></ColumnDefinition> <ColumnDefinition Width="2*"></ColumnDefinition> </Grid.ColumnDefinitions> 124

127 Windows Presentation Foundation <Label Grid.Column="0">Voer hier een waarde in:</label> <TextBox Grid.Column="1"></TextBox> </Grid> </DockPanel> </Window> using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; Code Listing 38: XAML code voor een eenvoudige layout namespace TestWPF /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : System.Windows.Window public Window1() InitializeComponent(); void Ok_Click(object sender, RoutedEventArgs e) //Code voor de Ok knop void Annuleer_Click(object sender, RoutedEventArgs e) //Code voor de Annuleer knop Code Listing 39: C# code die bij de interface hoort Figuur 73: Voorbeeld van een eenvoudige WPF interface In de XAML code voor deze applicatie zien we eerst en vooral de definitie van het venster waarin alles getoond zal worden. Hierbinnen is er een DockPanel die het mogelijk maakt om 125

128 Windows Presentation Foundation onderdelen van de interface uit te lijnen op de randen van het venster. Dit DockPanel zal de volledige oppervlakte van het venster innemen. Een eerste onderdeel is een label waar de titel van de pagina wordt weergegeven. Dit label wordt aan de bovenrand van het venster weergegeven door het dock attribuut in te stellen. Een volgend element is een nieuw panel namelijk een Grid. Deze wordt onderaan het venster vastgelegd en zowel de alineëring als de breedte worden ingesteld. Binnen deze Grid definiëren we de kolommen waar we elementen willen plaatsen. De eerste en de laatste kolom geven we de waarde 1* wat wil zeggen dat ze alle twee evenveel plaats mogen innemen om het paneel te vullen. De exacte waarden zijn hier niet van belang, het is de verhouding die telt. De tweede kolom krijgt een vaste waarde, hier wordt deze gebruikt als witruimte tussen de twee knoppen. Na de kolomdefinities worden de twee knoppen in XAML vastgelegd, elk met een verwijzing naar hun handler voor het Click event en de kolom waarin ze voorkomen. Net als bij tabellen is het ook mogelijk om elementen te definiëren die meerdere cellen van de Grid innemen. Als laatste element binnen het DockPanel is er nog een Grid die echter niet aan één van de zijden van het venster wordt vastgelegd, dit zorgt ervoor dat dit paneel alle overige ruimte kan innemen. Ook hier vinden we de kolomdefinities terug samen met een label en een knop. Naast de XAML code is er ook de codebehind file die de event handlers voor de knoppen specificeert en waar de passende code kan uitgevoerd worden. Zoals we in de code zien, zijn de elementen van een WPF interface opgebouwd als een boom. Het weergeven op een scherm van de applicatie berust dus op het renderen van deze visuele boom. Zoals gezegd zal dit indien mogelijk door de hardware gebeuren. Als blijkt dat de grafische kaart dit niet aankan dan zorgt WPF dat dit zal gebeuren door eigen software. Dit is een keuze die dynamisch wordt gemaakt bij het opstarten van de applicatie en waar een ontwikkelaar dus geen rekening moet mee houden. Een belangrijk voordeel van deze aanpak is dat WPF volledig verantwoordelijk is voor het renderen en hier veel efficiënter mee kan omgaan. Aangezien WPF werkt met objecten in plaats van pixels op een scherm kan er veel flexibeler omgesprongen worden met het herschalen van de lay-out, zeker omdat deze gebaseerd is op vectorafbeeldingen Stijlen en templates Naast het definiëren van de controls en de plaats ervan is het ook nodig om het uitzicht ervan te bepalen. Bij HTML pagina s kan dit via Cascading Style Sheets waardoor de stijl voor een volledige applicatie kan gedefinieerd worden. Binnen WPF is er nu ook een gelijkaardige mogelijkheid via de styles. Dit is opnieuw een aspect van de opsplitsing van het werk van ontwerpers en ontwikkelaars, waarbij de ontwerper kan zorgen voor een uniform uitzicht van de gehele applicatie terwijl de ontwikkelaar hier geen extra werk mee heeft. 126

129 Windows Presentation Foundation Door gebruik te maken van het XAML Style element kan de maker van een WPF applicatie vastleggen hoe bepaalde onderdelen er moeten uitzien en deze stijl dan hergebruiken doorheen de applicatie. <Application x:class="testwpf.app" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> <Application.Resources> <RadialGradientBrush x:key="buttonbackground"> <GradientStop Color="#FF303445" Offset="0"/> <GradientStop Color="#FF3B4C9B" Offset="1"/> </RadialGradientBrush> <Style x:key="buttonstyle"> <Setter Property="Control.Background" Value="StaticResource ButtonBackground"/> <Setter Property="Control.FontSize" Value="16"></Setter> <Setter Property="Control.Foreground" Value="White"></Setter> <Setter Property="Control.Margin" Value="5,5,5,5"/> </Style> </Application.Resources> </Application> Code Listing 40: XAML definitie van een stijl Elke knop waarop deze stijl dan wordt toegepast zal er hetzelfde uitzien. <Button Grid.Column="0" Click="Ok_Click" Style="StaticResource ButtonStyle">Ok</Button> <Button Grid.Column="1" Click="Annuleer_Click" Style="StaticResource ButtonStyle">Annuleer</Button> Code Listing 41: Toevoegen van een stijl aan een knop Figuur 74: WPF applicatie met stijlen We zien dat WPF stijlen meestal als resource worden gedefinieerd op het applicatieniveau, wat wil zeggen dat deze data wordt gescheiden van de code. Eerst wordt een GradientBrush, welke later aan bod komt, gedefinieerd die zorgt voor de kleurovergang op de knoppen. Daarna wordt deze Brush gebruikt als achtergrond voor de knop. De grootte en het kleur van het lettertype worden ook ingesteld, net als een marge van 5 pixels rondom de knoppen. Hier kunnen we dan ook de kolom van de Grid weglaten die we als witruimte gebruikten. De mogelijkheden van stijlen zijn echter niet beperkt tot de kleur van een element. Net als bij klassen is er ook overerving mogelijk waarbij bepaalde stijlelementen opnieuw worden gedefinieerd of uitgebreid. Het is ook mogelijk om een aantal triggers te specificeren die zorgen 127

130 Windows Presentation Foundation voor een gemeenschappelijk gedrag. Bij het bewegen van de muis over een knop kan bijvoorbeeld de kleur van de knop wijzigen. Deze triggers zorgen ervoor dat dit slechts eenmaal moet gedefinieerd worden binnen de style van de applicatie. Naast styles zijn er ook templates beschikbaar binnen WPF. De mogelijkheden hiervan zijn vergelijkbaar en er zijn twee varianten van: Data templates: Deze templates laten toe om te bepalen hoe data wordt weergegeven. Control templates: Hiermee wordt het voorkomen van een control vastgelegd. Het verschil met styles is dat het bij templates ook mogelijk is om de volledige structuur van een control te herdefiniëren. Op deze manier bouwen we zelf de visuele boom op van een control aan de hand van eenvoudige vormen Tekst Een basisonderdeel van de meeste grafische user interfaces is tekst, of minstens een aantal titels. Vele mensen prefereren echter nog steeds een geprinte versie boven het lezen van een tekst op een scherm. Onze standaarden liggen namelijk vrij hoog door de hoge kwaliteit van magazines en boeken. On-screen tekst lijkt hiermee vergeleken een stuk minder leesbaar. WPF probeert ook voor dit probleem een oplossing te bieden en on-screen tekst even leesbaar te maken als een geprinte pagina. Om dit te bekomen ondersteunt WPF de industrie standaard OpenType lettertypen waardoor bestaande verzamelingen van lettertypes kunnen gebruikt worden. Daarnaast wordt ook de recentere ClearType technologie ondersteund. Door sub-pixel positionering, een techniek om de individuele sub-elementen van een pixel te laten oplichten, ziet ClearType tekst er een stuk vloeiender uit. WPF voorziet ook in het renderen van tekst via de Glyphs klasse. Deze vinden we verder terug om karakters voor te stellen in XPS documenten. Om de leesbaarheid nog verder te verbeteren zijn er een aantal extras binnen WPF zoals ligatures, waarbij een groep van karakters vervangen wordt door één verbonden afbeelding. Hoewel dit bij het lezen niet meteen opvalt geeft het wel een natuurlijker gevoel bij het lezen van de tekst, zeker als het gaat om lettertypes die het handschrift proberen te benaderen Documenten Het meer leesbaar maken van tekst is zeker positief aangezien dit een vast onderdeel is van elke interface. Het wordt echter nog belangrijker bij het weergeven van lange teksten en volledige documenten. Een echte verbetering kan er dus maar zijn als deze documenten ook goed worden weergegeven. Om dit mogelijk te maken vinden we twee soorten documenten binnen WPF, de fixed en flow documenten. 128

131 Windows Presentation Foundation Fixed documenten zien er hetzelfde uit, zowel op het scherm als op een afgedrukte versie. Dit is zeker belangrijk voor sommige formulieren, wettelijke documenten en andere publicaties. Om zo een fixed document te definiëren wordt gebruik gemaakt van XPS, wat later aan bod komt. De inhoud van het document kan via een FixedDocument element gespecifieerd worden. Binnen dit eenvoudig element kan een lijst van PageContents elementen voorkomen, elk met de naam van een pagina binnen het document. Om deze documenten weer te geven is er de DocumentViewer control die het mogelijk maakt om het document te lezen, er in te navigeren en te zoeken naar tekst. In tegenstelling tot de fixed documenten worden flow documenten enkel op het scherm weergegeven. Hier ligt de nadruk op het zo leesbaar mogelijk maken van de tekst. WPF kan hiervoor de weergave van de tekst en afbeeldingen aanpassen volgens de grootte van het venster en andere factoren. Deze documenten vinden we binnen WPF terug als het FlowDocument. <FlowDocumentScrollViewer> <FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ColumnWidth="400" FontSize="14" FontFamily="Calibri"> <Paragraph FontSize ="16" FontWeight="Bold"> Een voorbeeld van een Flow Document </Paragraph> <Paragraph> Dit kan de inhoud zijn van een Flow Document. De WPF technologie zal ervoor zorgen dat deze tekst zo leesbaar mogelijk wordt weergegeven op het scherm van de gebruiker. </Paragraph> </FlowDocument> </FlowDocumentScrollViewer> Code Listing 42: XAML code voor de definitie van een Flow document Figuur 75: Applicatie die een Flow document weergeeft Om de leesbaarheid te verhogen zijn er een aantal opties beschikbaar voor Flowdocumenten. De IsOptimalParagraphEnabled zal er bijvoorbeeld voor zorgen dat de witspatie doorheen de paragraaf zo gelijkmatig mogelijk verdeeld wordt. Dit kan een overmaat aan witte gaten in een 129

132 Windows Presentation Foundation tekst voorkomen wat de leesbaarheid kan verhogen. Flow documenten ondersteunen ook het maken van notities bij een tekst, zowel getypt als geschreven op een tablet pc. Bij deze notities hoort een ankerpunt dat weergeeft bij welk deel van de tekst deze opmerking hoort. Om deze Flow documenten weer te geven zijn een aantal controls beschikbaar binnen WPF: FlowDocumentPageViewer: Maakt het mogelijk om pagina per pagina door het document te navigeren en bevat hiervoor een volgende en vorige knop. Daarnaast is het ook mogelijk om te zoomen. FlowDocumentScrollViewer: Hierbij wordt een scrollbar voorzien om door het document te navigeren. FlowDocumentReader: Combineert de vorige elementen en laat de gebruiker toe om te wisselen tussen een pagina georiënteerde weergave en een scrolweergave. Aangezien meer en meer informatie digitaal beschikbaar wordt wil WPF met deze documenten het gebruiksgemak van zo een toepassingen verhogen door de tekst beter leesbaar te maken Afbeeldingen Naast tekst zijn afbeeldingen zeker evenveel aanwezig in goede user interfaces. Binnen WPF worden ze voorgesteld door de Image control. Naast de effectieve afbeelding kan er ook meta-informatie, zoals kernwoorden en commentaar, opgeslagen zijn in het afbeeldingbestand. WPF kan deze informatie lezen en toevoegen aan bestanden. Alle gangbare afbeeldingsformaten kunnen weergegeven worden binnen deze control, hiervoor wordt gebruik gemaakt van de Windows Imaging Component. Naast alle standaardformaten ondersteund WIC ook het toevoegen van nieuwe codecs die nieuwe formaten kunnen weergeven Audio en video Doordat de capaciteit van hedendaagse computers sterk verhoogd is en breedband internet ook meer en meer beschikbaar is krijgen audio en video een steeds belangrijkere rol bij de interactie met software. Daarnaast wordt de pc als mediacenter gebruikt als ontspanning waarbij film en muziek centraal staan. Binnen WPF mag ondersteuning hiervoor dan ook niet ontbreken. Dit kan binnen de MediaElement control die vergelijkbaar is met de Image control. WMV, MPEG en AVI video worden ondersteunt naast verschillende audioformaten D Graphics Gedurende de voorbije twintig jaar was GDI, en zijn opvolger GDI+, de enige manier om tweedimensionale graphics weer te geven op het scherm. Het is dan ook verwonderlijk dat men zelfs binnen Windows Forms van een aparte namespace gebruik moest maken omdat het grafische aspect niet binnen de user interface technologie geïntegreerd was. Voor driedimensionale graphics was het nog erger gesteld aangezien een totaal aparte technologie nodige was, Direct3D. Met WPF vervalt deze complexe situatie voor de meeste applicaties. 130

133 Windows Presentation Foundation Zowel 2D als 3D grafieken kunnen nu gecreëerd worden met XAML of code vanuit de WPF bibliotheken. Zoals met alles bij WPF worden deze graphics dan een element in de visuele boom met alle grafische onderdelen van een user interface. We zien dat een aantal vormen beschikbaar zijn waarmee we afbeeldingen kunnen opbouwen: Lijn: Een rechte lijn tussen twee punten Ellips: Een ellips Rechthoek: Een rechthoek Polygoon: Een gesloten vorm bepaald door een groep verbonden rechte lijnen Polylijn: Een open vorm bepaald door een groep verbonden rechte lijnen Pad: Een vorm beschreven door een willekeurig pad. De vorm kan open of gesloten zijn en de lijnen van het pad kunnen recht of krom zijn. Eigenlijk zijn alle andere vormen een specifieke vorm van dit pad die enkel bestaan voor het gebruiksgemak. Om vormen op te vullen is er een brush nodig. Hierbij kunnen we kiezen voor een vaste kleur of een gradient, waarbij twee kleuren vloeiend in elkaar overgaan. Daarnaast kunnen ook afbeeldingen gebruikt worden als opvulling. Eén van de krachtigste brushes is de VisualBrush. Hierbij wordt in plaats van een afbeelding een visual object weergegeven. Dit is dus een element dat ergens voorkomt op de interface. Op deze manier is het mogelijk om reflecties of andere grafische effecten te creëren. Om meer opties voor de lijnen van de vorm te bepalen moet een pen gebruikt worden. Hiermee kan de stijl van de lijn, de dikte en de kleur ervan ingesteld worden. Naast de vormen zijn er ook een aantal klassen die hier erg op gelijken namelijk de geometrieën. Waar de vormen meestal gebruikt worden om iets weer te geven op het scherm zullen geometrieën eerder gebruikt worden om regio s af te bakenen. Dit kan bijvoorbeeld een gebied zijn waar de gebruiker in kan klikken om een actie te starten. <Window x:class="testwpf.window3" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWPF" Height="160" Width="200" > <Grid x:name="layoutroot"> <Grid.RowDefinitions> <RowDefinition Height="1*"></RowDefinition> <RowDefinition Height="5"></RowDefinition> <RowDefinition Height="1*"></RowDefinition> </Grid.RowDefinitions> <Grid.Background> <LinearGradientBrush EndPoint="1,0" StartPoint="0,1"> <GradientStop Color="#FF000000" Offset="0"/> <GradientStop Color="#FFFFFFFF" Offset="1"/> </LinearGradientBrush> </Grid.Background> <Grid Margin="10,10,10,10" Grid.Row="0" Name="RectangleBase"> <Button Content="Klik Hier" /> </Grid> 131

134 Windows Presentation Foundation <Rectangle Margin="10,10,10,10" Grid.Row="2" x:name="rectangle"> <Rectangle.OpacityMask> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="# " Offset="0"/> <GradientStop Color="#7FFFFFFF" Offset="1"/> </LinearGradientBrush> </Rectangle.OpacityMask> <Rectangle.RenderTransform> <TransformGroup> <ScaleTransform ScaleX="1" ScaleY="-1"/> <TranslateTransform X="0" Y="35"/> </TransformGroup> </Rectangle.RenderTransform> </Rectangle> </Grid> </Window> Code Listing 43: XAML code van een WPF applicatie met een VisualBrush using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace TestWPF /// <summary> /// Interaction logic for Window3.xaml /// </summary> public partial class Window3 : System.Windows.Window public Window3() InitializeComponent(); Rectangle.Fill = new VisualBrush(RectangleBase); protected override void OnInitialized(EventArgs e) base.oninitialized(e); Rectangle.Fill = new VisualBrush(RectangleBase); Code Listing 44: C# code van een WPF applicatie met een VisualBrush 132

135 Windows Presentation Foundation Figuur 76: WPF applicatie met een VisualBrush Deze applicatie maakt gebruikt van zowel een VisualBrush als van een aantal transformaties die later aan bod komen. Daarnaast wordt een GradientBrush gebruikt om de achtergrond van het venster wat aantrekkelijker te maken. De knop op het venster bevindt zich in een Grid die we een naam hebben gegeven, RectangleBase. Door een VisualBrush te gebruiken om een Rectangle op te vullen met deze RectangleBase zal de inhoud van de Grid weergegeven worden in de rechthoek. Door hier dan een aantal transformaties op toe te passen kunnen we een spiegeleffect maken. Daarnaast is er ook voor gezorgd dat het spiegelbeeld steeds doorzichter wordt naarmate het verder is van het origineel. Als laatste is het belangrijk om te weten dat alle vormen en geometrieën die hierboven beschreven staan geïmplementeerd zijn bovenop de visual layer. Het is ook mogelijk om rechtstreeks met deze visual layer te werken voor eenvoudige applicaties of software waarvan de grafische performantie zeer hoog dient te zijn D Graphics Tweedimensionale graphics maken al lang deel uit van de onderdelen van een interface dus is dit onderdeel van WPF ook vrij uitgebreid. Driedimensionale graphics zien we echter nog niet zoveel, hoewel ze handig kunnen zijn om data voor te stellen in verschillende soorten grafieken. Voorheen was het werken in 3D iets gespecialiseerd en voornamelijk terug te vinden in games en tekensoftware. WPF wil echter 3D binnen het bereik brengen van gewone ontwikkelaars. Voor WPF had men meestal Direct3D nodig om driedimensionale graphics weer te geven. Nu gebruikt WPF deze Direct3D API achter de schermen maar biedt een veel eenvoudigere manier van werken aan naar de ontwikkelaars toe. Om 3D grafieken weer te geven maken we gebruik van de Viewport3D control. Deze geeft een zicht op de driedimensionale wereld die in de applicatie beschreven wordt. Om een 3D scene te creëren beschrijft de ontwikkelaar één of meerdere modellen en beschrijft hoe deze modellen moeten verlicht en gezien worden. Zoals gewoonlijk kan dit zowel in XAML als in code. Om zo een model te beschrijven is er de GeometryModel3D klasse die de vorm van het model bepaalt. Na het definiëren van een model kan het uitzicht ervan bepaald worden door 133

136 Windows Presentation Foundation het aanbrengen van verschillende soorten materialen. De SpecularMaterial klasse maakt het oppervlak bijvoorbeeld glanzend terwijl de DiffuseMaterial klasse dit niet doet. Onafhankelijk van het model of de toegepaste materialen kan bepaald worden hoe een model belicht wordt. DirectionalLight geeft licht dat vanuit een bepaalde richting komt terwijl AmbientLight in een uniforme verlichting voor alle voorwerpen in de scene voorziet. Als laatste gebruiken we een camera om te bepalen hoe een model gezien wordt. Een PerspectiveCamera laat toe te bepalen vanuit welk perspectief en vanop welke afstand we naar het model kijken. Een OrthographicCamera doet hetzelfde maar dan zonder perspectief: objecten die verder van de camera verwijderd zijn zien er niet kleiner uit. Het moet wel gezegd worden dat complexe 3D modellen niet zo eenvoudig te definiëren zijn in XAML. In de praktijk zullen dan ook grafische tools gebruikt worden om de definities te genereren voor de modellen. Hoe deze modellen ook gemaakt worden, het brengt nieuwe mogelijkheden om user interfaces naar een hoger niveau te tillen Transformaties en effecten Naast het definiëren van vormen en andere elementen voorziet WPF ook in het aanpassen van deze elementen, zoals het draaien of wijzigen van de grootte ervan. In XAML worden hiervoor de RotateTransform en ScaleTransform gebruikt en deze kunnen op elk user interface onderdeel toegepast worden. Daarnaast bevat WPF ook een aantal voorgedefinieerde effecten. Net zoals de vorige aanpassingen kunnen deze op allerhande onderdelen van een interface toegepast worden zoals op knoppen of keuzelijsten. Er is onder andere een blur effect te vinden dat het interface element wazig maakt, een outer glow dat de indruk geeft dat het element gloeit of een drop shadow effect dat voor een schaduw zorgt achter het element Animaties Bij het creëren van een goede interface kan het ook nodig zijn om beweging te brengen in de elementen ervan. Het klikken op een knop kan er bijvoorbeeld voor zorgen dat de knop verschuift en plaats maakt voor extra informatie. Complexere animaties kunnen er ook voor zorgen dat de aandacht gevestigd wordt op belangrijke onderdelen. Dit is dan ook een onderdeel van WPF. Net zoals bij vervormingen en effecten kunnen animaties op verschillende aspecten van een interface toegepast worden. De animatie wordt bekomen door één of meerdere eigenschappen van een element aan te passen over een bepaalde tijd. 134

137 Windows Presentation Foundation Het is meestal ook nuttig om meerdere verwante animaties te voorzien. Daarom vinden we in WPF de Storyboard klasse. Hierbinnen kunnen een aantal tijdslijnen voorkomen die elk één of meerdere animaties kunnen bevatten. Deze kunnen zowel sequentieel of parallel uitgevoerd worden. <Ellipse Width="100" Height="50" Fill="Blue" Name="EllipsVoorAnimatie"> <Ellipse.Triggers> <EventTrigger RoutedEvent="Mouse.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard x:name ="Animation"> <Storyboard> <DoubleAnimation Storyboard.TargetName="EllipsVoorAnimatie" Storyboard.TargetProperty="Height" From="50" To ="25" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Ellipse.Triggers> </Ellipse> Code Listing 45: Animatie op een ellips In deze code wordt een animatie gedefinieerd op een ellips. Het event dat de animatie zal starten is het bewegen van de muis binnen de ellips. De animatie bestaat eruit dat de hoogte van de ellips zal gewijzigd worden van 50 naar 25 en dit over een tijdsspanne van 2 seconden. De animatie zal daarna automatisch terugkeren naar de beginpositie en dit blijven herhalen. Figuur 77: Begin van de animatie 135

138 Windows Presentation Foundation Figuur 78: Latere opname van de animatie Het is ook mogelijk om animaties te definiëren aan de hand van een tijdlijn waardoor het mogelijk is om bepaalde eigenschappen niet lineair te laten variëren gedurende een bepaalde tijdsspanne Data Binding Waar alle vorige onderdelen toegespitst waren op het visuele aspect komt nu de essentie van een interface namelijk de data die er op weergegeven wordt. Om dit eenvoudiger te maken voor de ontwikkelaars kan in verregaande mate gebruik gemaakt worden van data binding. Onder data binding verstaan we het koppelen van de inhoud van een WPF control aan data die buiten die control te vinden is. We kunnen bijvoorbeeld de Text property van een TextBox binden aan een property Naam van een Werknemer object uit de business objecten. Een verandering aan één van deze properties kan dan meteen weergegeven worden in de andere. Om dit te realiseren is er de Binding klasse. Ook complexere data binding is mogelijk. Een ListBox kan bijvoorbeeld opgevuld worden van uit elk object dat de IEnumerable interface implementeert. Indien nodig kan deze data nog eens gefilterd of gesorteerd worden voor ze weergegeven worden. Data binding met een ADO.NET database is ook nog steeds mogelijk maar hiervoor biedt WPF geen directe ondersteuning. Op welke manier de binding ook gebeurt, dit kan het ontwikkelen van interfaces en het weergeven van data erop opnieuw een stuk verbeteren. <?xml version="1.0" encoding="utf-8"?> <Werknemers> <Werknemer> <Naam>Spileers</Naam> <Voornaam>Fréderic</Voornaam> <Id>fsp</Id> <Leeftijd>22</Leeftijd> </Werknemer> <Werknemer> <Naam>Deschepper</Naam> <Voornaam>Tom</Voornaam> 136

139 Windows Presentation Foundation <Id>tde</Id> <Leeftijd>23</Leeftijd> </Werknemer> </Werknemers> Code Listing 46: XML bestand met de data voor de applicatie <Window x:class="testwpf.window4" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWPF" Height="219" Width="392"> <Window.Resources> <XmlDataProvider x:key="dewerknemers" Source="Werknemers.xml" XPath="/Werknemers/*"></XmlDataProvider> <DataTemplate x:key="showid"> <TextBlock Text="Binding XPath=Id"/> </DataTemplate> </Window.Resources> <Grid DataContext="Binding Source=StaticResource dewerknemers"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*" /> <ColumnDefinition Width="2*" /> <ColumnDefinition Width="2*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <ListBox Grid.Column="0" Grid.RowSpan="5" ItemsSource="Binding Source=StaticResource dewerknemers" ItemTemplate="StaticResource showid" IsSynchronizedWithCurrentItem="True" /> <Label Grid.Row="0" Grid.Column="1">Id</Label> <Label Grid.Row="1" Grid.Column="1">Naam</Label> <Label Grid.Row="2" Grid.Column="1">Voornaam</Label> <Label Grid.Row="3" Grid.Column="1">Leeftijd</Label> <TextBox Grid.Row="0" Grid.Column="2" Text="Binding XPath=Id"></TextBox> <TextBox Grid.Row="1" Grid.Column="2" Text="Binding XPath=Naam"></TextBox> <TextBox Grid.Row="2" Grid.Column="2" Text="Binding XPath=Voornaam"></TextBox> <TextBox Grid.Row="3" Grid.Column="2" Text="Binding XPath=Leeftijd"></TextBox> </Grid> </Window> Code Listing 47: XAML code van de applicatie 137

140 Windows Presentation Foundation Figuur 79: WPF applicatie met data binding Deze voorbeeldapplicatie toont hoe eenvoudig het is om de data vanuit een XML bestand weer te geven op een WPF interface. In de XML file zijn een aantal personen gedefinieerd met elk een aantal eigenschappen zoals hun naam. In de code wordt een XmlDataProvider gedeclareerd om met de XML file te kunnen werken en een DataTemplate om vast te leggen hoe de data moet weergegeven worden. Voor de Grid waar alle elementen in voorkomen wordt de DataContext op deze XmlDataProvider ingesteld waardoor binnen deze Grid hier standaard mee gewerkt wordt. Voor de Listbox wordt gebruik gemaakt van de XML dataprovider om een lijst te maken van alle werknemers. Daarnaast is ook een itemtemplate nodig om de juiste gegevens in de lijst weer te geven. De IsSynchronizedWithCurrentItem wordt ook ingesteld om de juiste informatie in de detailvelden weer te geven. Als laatste wordt de Text property van alle tekstvelden met de juiste binding ingevuld en de informatie wordt weergegeven. Er komt dus geen regel C# code aan te pas User Interface automation Als laatste onderdeel een misschien iets minder voor de hand liggende mogelijkheid maar daarom niet minder belangrijk. In de meeste gevallen is de gebruiker van een WPF interface een persoon. Het kan echter zijn dat andere software deze interface moet sturen. Deze user interface automation maakt dit dan mogelijk. Eén van de situaties waar dit nodig kan zijn is tijdens de testfase van een interface. In plaats van alles manueel uit te proberen kan de ontwikkelaar scripts schrijven die automatisch de interface testen. Een andere mogelijkheid is de ondersteuning voor extra toegankelijkheids opties zoals het luidop lezen van de verschillende onderdelen van een interface voor slechtzienden. Doordat het mogelijk is om programmatorisch door de boom met alle elementen van een interface te wandelen kan dit gerealiseerd worden. Om dit mogelijk te maken creëert WPF een UI automation tree. Deze boom bestaat uit AutomationElement objecten die elk onderdeel van de interface voorstellen. De wortel van de 138

141 Windows Presentation Foundation boom is de desktop en elke geopende applicatie is een kind van deze wortel. Om volledige programmatorische toegang te voorzien wordt elk onderdeel waarmee een gebruiker kan werken voorgesteld als een AutomationElement. Zoals gezegd zal dit onderdeel van WPF door de meeste ontwikkelaars nooit gebruikt worden maar voor de enkelingen die het nodig hebben maakt het de zaken wel een stuk eenvoudiger Toepassingen van WPF Zoals we hierboven gezien hebben bestaat WPF uit een uitgebreide verzameling technologieën. In de praktijk zien we dat deze in drie soorten applicaties worden gebruikt Stand-alone WPF Applicaties De meest voor de hand liggende manier om WPF te gebruiken is als stand-alone applicatie, een alternatief voor Windows Forms dus. Deze applicaties draaien als eender welke Windows applicatie. Ze hebben dus full trust en alle mogelijkheden van WPF kunnen gebruikt worden. Daarnaast kunnen deze applicaties ook gebruik maken van de andere services die op de machine beschikbaar zijn zoals WCF. Net zoals bij andere applicaties kunnen deze stand-alone WPF toepassingen vanop een lokale of een netwerkschijf geïnstalleerd worden. Daarnaast kan dit ook via ClickOnce, een mogelijkheid binnen het.net Framework. Door ClickOnce kunnen Internet Explorer gebruikers op een eenvoudige manier Windows applicaties, en dus ook WPF toepassingen, installeren en ervoor zorgen dat ze automatisch geüpdatet worden indien nodig XAML Browser applicaties: XBAP s Een nieuwe mogelijkheid binnen WPF is het draaien van applicaties binnen de browser. Dit kan in sommige situaties een betere keuze zijn al waren de grafische mogelijkheden daar voor WPF eerder beperkt. Met WPF is het nu ook mogelijk om binnen een browser dezelfde grafische interfaces aan te bieden als bij stand-alone applicaties. Een XBAP draait dus binnen Internet Explorer en kan daar een client zijn voor Web applicaties die ontwikkeld werden met ASP.NET, JavaServer Pages of andere web technologieën. Om met deze applicaties te communiceren kan er gekozen worden voor http of SOAP. Welk server platform ook gebruikt wordt, de XBAP wordt steeds geladen via ClickOnce. Er komen echter geen dialogen naar de gebruiker toe, de XBAP wordt net zoals een web pagina geladen. Aangezien er dus niets geïnstalleerd wordt zijn deze XBAP s ook niet terug te vinden in het overzicht van software op de computer. Hoewel dit niet verplicht is zullen XBAP s meestal een navigatiegestuurde interface aanbieden aan de gebruiker. Zo kan de applicatie zich gedragen als een web cliënt wat ook meestal in de 139

142 Windows Presentation Foundation verwachting ligt van de gebruiker. Binnen Internet Explorer 7 kan de XBAP de vorige en volgende knoppen van de browser gebruiken en zullen de bezocht XAML pagina s ook in de historiek verschijnen. Bij Internet Explorer 6 zal de XBAP zelf voor deze knoppen zorgen en zal zelf een historiek bijhouden. De XBAP kan dit volledig zelf bepalen dus dit vergt geen extra werk van de ontwikkelaar. Aangezien deze applicaties van het Web worden geladen en in een browser draaien is er een beperkte trust vanuit het.net Framework s code access security systeem. Er zijn dus een aantal zaken die een stand-alone applicatie meer kan dan deze XBAP s. De volgende zaken zijn niet mogelijk binnen een XBAP: Stand-alone vensters aanmaken. Dialoogvensters weergeven die binnen de applicatie zijn gedefinieerd. Een Save dialoogvenster weergeven dat door de XBAP zelf wordt gestart. Het bestandssysteem aanspreken tenzij binnen een gelimiteerde Isolated Storage area. Als een UI automation client werken. WCF gebruiken. Aangezien WCF applicaties full trust vereisen kunnen XBAP s die via het net verspreid worden hier geen gebruik van maken. Ze kunnen wel gebruik maken van ASP.NET Web services om te communiceren met de web applicatie waaruit ze werden geladen. Gebruik maken van code die gecreëerd werd met Windows Forms, Microsoft Foundation Classes (MFC) of directe Win32 calls. Hoewel dit allemaal kan in stand-alone WPF applicaties is dit niet mogelijk binnen XBAP s door het beperkt trust level. Gebruik maken van unmanaged code. Het is echter ook mogelijk om deze XBAPs met full trust uit te voeren, al is dit niet het standaard gedrag. Zoals gezegd is het mogelijk om dezelfde code te gebruiken voor stand-alone WPF applicaties als voor een XBAP versie ervan. De beperkingen die hierboven vermeld werden blijven echter bestaan. Om dit te omzeilen kan er wel met conditional compilation gewerkt worden waarbij de functionaliteit die binnen een XBAP niet toegelaten is binnen ifdefs voorkomt. Voor de rest kan de XBAP versie het meeste van wat de stand-alone applicatie kan zoals het weergeven van documenten en de twee- en driedimensionale grafieken, het afspelen van audio en video en veel meer. Daarnaast zal de XBAP ook optimaal gebruik maken van de hardware die beschikbaar is. Naast XBAP s is het ook mogelijk om pure XAML paginas direct in Internet Explorer weer te geven. Dit wordt loose XAML genoemd en kan interessant zijn om statische pagina s te tonen in de browser. Van zodra er events nodig zijn moet er code geschreven worden en is men aangewezen op XBAP s. 140

143 Windows Presentation Foundation De XBAP s laten dus toe om de meeste functionaliteit van WPF in een browser te gebruiken en dit met code die met een stand-alone applicatie kan gedeeld worden. Voor Web applicaties die als doelgebied de nieuwere Windows platformen zijn kan dit dus een aantrekkelijke keuze zijn XPS Documenten Zoals eerder gezien maken fixed-format documenten zeker een deel uit van moderne user interfaces. Binnen WPF is er de DocumentViewer control om deze XPS documenten weer te geven. Daarnaast wordt de technologie om deze documenten te definiëren ook binnen WPF gerekend, terwijl deze toch niet meteen bepalend is voor het creëren van een user interface. Eén van de belangrijke redenen hiervoor is dat XPS documenten ook in XAML gedefinieerd worden. Het is weliswaar een subset van elementen uit XAML die gebruikt worden, zoals het Canvas element voor de layout, het Glyps element om tekst voor te stellen en het Path element om tweedimensionale grafieken op te bouwen. De belangrijkste toepassingen van XPS zijn echter niet zozeer het weergeven van tekst op schermen. Binnen Vista wordt XPS het standaard print formaat. XPS doet dienst als een page description language waardoor XPS documenten rechtstreeks kunnen gerenderd worden door printers met XPS mogelijkheden. Zo wordt eenzelfde taal, XAML, gebruikt vanop het scherm tot aan de printer. Het verbetert ook de bestaande GDI-gebaseerde printmogelijkheden binnen Windows, waardoor complexe grafische effecten zoals transparantie en kleurovergangen beter kunnen afgeprint worden. Naast XAML kan een XPS document ook verschillende soorten afbeeldingen bevatten, informatie omtrent het lettertype, de documentstructuur en zo verder. Indien nodig kunnen deze documenten ook digitaal ondertekend worden met de W3C XML Signature definitions en X.509 certificaten. Wat het ook mag bevatten, de documenten worden opgeslagen in een formaat dat vastgelegd werd door de Open Packaging Conventions. OPC is een packaging model en specificeert hoe de verschillende delen van een XML document (dus niet enkel voor XAML of XPS) met elkaar verbonden zijn, hoe ze opgeslagen worden in een standaard zip formaat en veel meer. Naast WPF maakt ook Microsoft Office 2007 gebruik van OPC voor de ingebouwde XML formaten. De drie belangrijkste scenario s om van OPC gebruik te maken zijn: Aangepaste bestandsformaten definiëren XPS en Office 2007 documenten direct aanspreken Document oplossingen aanbieden voor XPS documenten, Office 12 bestanden of zelf gecreëerde files. Het wordt sterk aangeraden om OPC te gebruiken voor eigen bestandsformaten omdat dit het mogelijk maakt om van de gemeenschappelijke services gebruik te maken. 141

144 Windows Presentation Foundation Het packaging model biedt de basis aan van een bestandsformaat, dat beschreven staat in de OPC specificatie. Deze packages zijn te gebruiken door elke applicatie en er zijn reeds meerdere implementaties zoals binnen Office 2007 voor de nieuwe.docx,.xlss en.pptx formaten. De inhoud van deze files kan bereikt worden via de packaging services of via een standaard zip utility. Het rels.relx bestand is de master index voor de bestanden, hier zijn de links te vinden naar andere XML files met de metadata, het document zelf, een thumbnail en zo verder. De OPC APIs zijn te vinden in de System.IO.Packaging namespace, binnen de WindowsBase assembly. Hiermee worden klassen zoals Package, PackagePart en PackagePartCollection beschikbaar. Met de API kunnen packages geopend en gesloten worden, kunnen parts en relaties gecreëerd en verwijderd worden, kan de naam, het content-type en de stream voor parts opgevraagd worden, kunnen de streams gelezen worden en zo verder. Naast de inhoud is er ook een header die hoort bij de verpakte inhoud. Hierin kunnen drie verschillende soorten informatie opgeslagen worden: Veelvoorkomende metadata o Een Categorie o De Status van de inhoud o Het type van de inhoud o De auteur o De datum van aanmaak o De datum van de laatste wijziging o Een beschrijving o Kernwoorden o Persoon die de laatste wijziging heeft aangebracht o De titel Digitale handtekeningen maken het mogelijk om na te gaan of de ondertekende inhoud zonder aanpassingen de bestemmeling heeft bereikt. Deze handtekeningen zijn beschikbaar voor alle OPC formaten. De certificaten zijn compatibel met XML Digital Signatures en volgen de X.509 standaard. De keuze van de onderdelen waarop de handtekening van toepassing is wordt bepaald door een signing policy. De certificaten kunnen zich in een apart deel bevinden of kunnen verpakt zitten binnen de handtekening. Om handtekeningen te plaatsen of te controleren wordt gebruik gemaakt van de PackageDigitalSignatureManager klasse, de PackageDigitalSignature klasse stelt de handtekening zelf voor. Rechten beheer. Binnen de OPC wordt geen specifiek rechten beheerssysteem opgelegd. Van Microsoft uit wordt wel zo een systeem geleverd met het oog op Windows Vista, namelijk de Windows Right Management Services. Deze API is te 142

145 Windows Presentation Foundation vinden binnen de System.Security.RightsManagement namespace en kan gebruikt worden om rechten beheer toe te passen op data files die het packet implementeren. Het XPS document formaat kan gezien worden als een zelf gedefinieerd bestandsformaat. We vinden een aantal onderdelen terug waaronder de volgende: FixedDocumentSequence (root) FixedDocument (document markup) FixedPage (pagina markup) Font (embedded lettertype) Image (embedded afbeelding) Thumbnail (thumbnails van de pagina s) PrintTicket (printer instellingen) Binnen een XPS document zijn er een aantal APIs die de functionaliteit van de package APIs uitbreiden. Hier vinden we onder andere het XpsDocument, de IDocumentSequenceReader en de IFixedDocumentReader. Met deze APIs kan het document gemanipuleerd worden door het toevoegen of verwijderen van parts of door de properties te wijzigen. Het voordeel van deze APIs is dat ze een stuk gebruiksvriendelijker zijn dan de OPC APIs. Zoals gezegd bestaat binnen WPF de DocumentViewer control om XPS documenten weer te geven. Daarnaast heeft Microsoft een XPS viewer gecreëerd, met behulp van de WPF controls. Dit maakt het mogelijk om door documenten te navigeren en erin te zoeken. Het is ook de bedoeling om XPS documenten niet te zien als Windows-specifiek dus is Microsoft bezig met XPS viewers voor andere platformen. Om het voor ontwikkelaars mogelijk te maken om met XPS documenten te werken is er een verzameling van API s om ze te maken, te laden en te wijzigen. WPF applicaties kunnen ook met documenten werken op het OPC niveau, waardoor een uniforme toegang tot XPS documenten, Office 2007 en andere mogelijk is. Bij het werken met de Workflow Foundation zijn deze API s ook beschikbaar om workflows te creëren die XPS documenten gebruiken. Door toepassingen te laten werken met fixed-format documenten via WPF wordt dit ook een deel van moderne user interfaces. Door dezelfde technologie te gebruiken om documenten weer te geven en te printen is het ook mogelijk om een betere overeenkomst te krijgen tussen wat men ziet op het scherm en wat uit de printer komt. Hoewel dit allemaal niet meteen verwacht wordt bij een technologie die zich focust op user interfaces maakt het er toch een belangrijk deel van uit. 143

146 Windows Presentation Foundation Performantie Alle vorige onderdelen gaan erover hoe het maken van interfaces verbeterd wordt met WPF. Een belangrijk aspect dat hierbij zeker niet uit het oog mag verloren worden is de invloed hiervan op de snelheid van deze applicaties. Een user interface mag er dan nog spectaculair uitzien, als het te lang duurt voor de gebruiker er iets mee kan doen zal deze al snel niet meer gebruikt worden. Zoals gezegd zal WPF hardware rendering toepassen van zodra dit mogelijk is. Hiervoor wordt Direct3D gebruikt om versnelde rendering mogelijk te maken vanaf DirectX 7, met extra optimalisaties voor DirectX 9 grafische kaarten en Pixel Shader 2.0 hardware. Voor toestellen zonder deze mogelijkheden is er de software rendering, een cpu-gebaseerde SSE en SSE2 geoptimaliseerde rasterizer. Dit wordt ook toegepast als het voor WPF niet mogelijk is om de hardware pipeline te gebruiken bij het renderen, waardoor de applicaties op alle mogelijke hardware configuraties kunnen uitgevoerd worden. Het gevolg is dus dat WPF zowel hardware als software pipelines gebruikt, die natuurlijk uiteenlopende performantiekarakteristieken vertonen. Dit maakt de totale snelheid van een applicatie moeilijk te voorspellen aangezien er twee wegen te behandelen zijn. In de praktijk weten we dat hardware een stuk sneller is, het komt er dus op neer om gepaste minimum vereisten op te geven voor een applicatie. Binnen WPF is het ook mogelijk om op een eenvoudige manier de hardware te controleren waarna het mogelijk is om de interface aan te passen aan de mogelijkheden van het systeem. Zo kunnen effecten als reflecties en transparantie uitgeschakeld worden op lichtere systemen om deze ook de kans te geven om snel te werken Debuggen van performantieproblemen Perforator is een nieuw onderdeel in de SDK waarmee het mogelijk is om naar elke draaiende WPF applicatie te connecteren en er vervolgens performantie metingen op uit te voeren. Het is ook mogelijk om real time veranderingen aan te brengen aan de WPF rendering om problemen op te sporen. Het is bijvoorbeeld mogelijk om na te gaan welke onderdelen van de interfaces door software worden gerenderd. Een andere tool is ETW. Tools zoals tracelog, tracerpt en mofcomp kunnen ETW events opvangen en gebruiken. Een derde mogelijkheid is het traditionele profiling om bottlenecks in applicaties op te sporen. Enterprise Profiler Tool is een deel van Visual Studio 2005 en biedt samples en instrumentation modes aan. Als laatste is er de CLRProfiler, dat te verkrijgen is van de Microsoft website, waarmee heap allocattion problemen kunnen nagegaan worden samen met de performantiekost die erbij hoort. 144

147 Windows Presentation Foundation Performantietips Om de snelheid van data-intensieve applicaties op te drijven kan virtualisatie een mogelijkheid zijn. Binnen WPF kan dit door de VirtualizingStackPanel control. Deze is tot 70 keer sneller dan een StackPanel voor een groot aantal items. Het is ook mogelijk om dit zelf te voorzien door zo weinig mogelijk items in de visuele boom te houden tijdens de uitvoering. Het gebruik van resources in XAML en de resource dictionary binnen code kan ook helpen bij het hergebruik van resources. Dit is voornamelijk belangrijk bij het hergebruiken van controls. Daarnaast is het ook interessant om alle objecten die Freezable zijn, zoals een brush of een pen, effectief te freezen als ze niet gebruikt worden. Op die manier nemen ze minder plaats in aangezien WPF niet moet luisteren naar events van deze objecten. Zo kan de performantie verder verbeterd worden Tools voor WPF WPF is in de eerste plaats bedoeld voor ontwikkelaars. Het zijn deze mensen die de applicaties bedenken en zorgen dat ze gerealiseerd worden. Het is echter de combinatie van deze ontwikkelaars met ontwerpers die voor echt goede software kan zorgen. Om dit mogelijk te maken zijn er enkele tools beschikbaar Microsoft Visual Studio Dit is Microsoft s standaard applicatie als het gaat over software ontwikkeling. Het is dan ook logisch dat WPF hier een deel van zal uitmaken. Bij de release van.net 3.0 zijn een aantal extensions beschikbaar gekomen die het mogelijk maken om WPF applicaties te maken vanuit Visual Studio Er is een Visual Designer die het mogelijk maakt om op visuele manier interfaces te creëren, dus door knoppen en dergelijk op een venster te slepen. De ondersteuning voor WPF is echter nog niet optimaal, bij complexe interfaces laat de Designer het nogal eens afweten en is men aangewezen op pure XAML code. Bij de volgende release van Visual Studio, met code naam Orcas, zal deze Visual Designer, met een eigen code naam Cider, hopelijk beter werken Microsoft Expression Studio Zoals gezegd is de Designer binnen Visual Studio voorlopig geen groot succes. Daarenboven blijft deze beperkt tot het plaatsen en positioneren van elementen. De kracht van ontwerpers ligt echter in het gebruik van kleuren, vormen en grafische effecten. Hiervoor is dus ook een tool nodig die hier de focus op legt. De Microsoft Expression Studio is een pakket van vier grafische tools die elk voor een specifieke taak kunnen gebruikt worden. 145

148 Windows Presentation Foundation Expression Web is de tool die kan gebruikt worden om websites te maken. De nadruk ligt hier dan ook op HTML, XML, ASP.NET en CSS. De tool kan gebruikt worden om zowel statische als dynamische applicaties te maken en zorgt ervoor dat deze voldoen aan de huidige webspecificaties. Op deze manier zijn de websites zeker toegankelijk voor verschillende browsers. Expression Blend is het onderdeel van het pakket dat gebruikt wordt om user interfaces te maken gebaseerd op WPF. Binnen de applicatie zijn alle controls beschikbaar die we ook in XAML kunnen definieren. De designer maakt het mogelijk om op een visuele manier de interface op te bouwen. Daarnaast is er ook ondersteuning voor alle mogelijke soorten effecten zodat deze niet in code moeten opgebouwd worden maar aan de hand van menu s kunnen worden ingesteld. Er is ook een tijdlijn aanwezig om op een intuitieve manier animaties aan de interface toe te voegen. Alles wat binnen de designer gebeurt wordt meteen in de XAML code aangepast wat het mogelijk maakt om deze XAML bestanden te gebruiken vanuit Visual Studio om verdere functionaliteit toe te voegen. Expression Design is een grafische tekentool die het mogelijk maakt om eigen afbeeldingen te ontwerpen om later eventueel op websites of user interfaces te gebruiken. De afbeeldingen zijn vectorafbeeldingen wat zorgt voor een grotere flexibiliteit en geen kwaliteitsverlies bij het herschalen. Het is ook mogelijk om deze als XAML bestand te bewaren en vervolgens in Expression Blend toe te voegen aan een interface. Expression Media is een management tool die toelaat om digitale media te catalogeren, te bewerken en weer te geven. Zowel afbeeldingen als video kunnen opgenomen worden in de catalogus, ongeacht van welke bron ze komen, harde schijf, cd of dvd. De software zorgt ervoor dat alles bijgehouden wordt zelfs als de bron offline is. Al deze applicaties maken het voor ontwerpers mogelijk om goede interfaces te maken en deze door te geven aan de ontwikkelaars die dan voor de functionaliteit kunnen zorgen. Doordat deze tools opgevat zijn als grafische tools zullen de ontwerpers er zich dan ook meteen in thuis voelen en snel aan de slag kunnen. Het kan uiteindelijk heel wat werk besparen voor beide partijen aangezien de vertaalstap van schetsen naar interfaces kan worden weggelaten Electric Rain ZAM 3D Naast de Microsoft tools om met WPF te werken zijn er ook een aantal andere bedrijven die met XAML verder willen. Een belangrijke speler hierin is zeker Electric Rain die met ZAM 3D een tool heeft ontwikkeld om 3D modellen te maken en dit gebaseerd om XAML. Terwijl Microsoft zich geconcentreerd heeft op het maken van toepassingen met XAML is Electric Rain meer de grafische mogelijkheden van XAML gaan verkennen. Met hun applicatie is het dan ook mogelijk om volledige animaties te maken met 3D modellen, zoals dit kan in andere paketten zoals 3D Studio Max en LightWave. Het grote verschil is echter dat deze 146

149 Windows Presentation Foundation modellen in XAML gedefinieerd zijn en dus meteen kunnen gebruikt worden binnen Expression of Visual Studio als onderdeel van een WPF applicatie WPF en andere technologieën We zien dat WPF een aantal ingrijpende vernieuwingen brengt in het ontwikkelen van Windows Applicaties. Het is dan ook logisch dat dit zijn weerslag heeft op andere technologieën waar WPF mee kan samenwerken. Het is echter wel belangrijk om te onthouden dat deze andere technologieën niet verdwijnen, ze blijven werken als voorheen, al zullen ze waarschijnlijk geleidelijk aan in onbruik geraken door de nieuwere versies ervan binnen.net Windows Forms Voor WPF was Windows Forms dé technologie om grafische user interfaces te creëren voor het Windows platform. Het is zelfs te verwachten dat deze technologie nog een tijd zal worden gebruikt aangezien er in essentie niets mis mee is. Er zijn namelijk nog vele systemen waarop WPF niet beschikbaar is, zoals oudere versies van Windows. Het is dus een logische keuze om daar verder te werken met Windows Forms. Voor het ogenblik is het ook zo dat de verzameling beschikbare controls voor Windows Form veel uitgebreider is en er dus sneller tot een resultaat kan gekomen worden door bestaande zaken te hergebruiken. Als laatste is er natuurlijk de drempel voor ontwikkelaars om over te schakelen naar een nieuwe technologie. Hoewel WPF opmerkelijk beter is dan Windows Forms vereist het ook een totaal andere manier van ontwikkelen. Bepaalde ontwikkelaars zullen dan ook liever wat wachten en nog even blijven verder werken in hun vertrouwde omgeving. Het is echter zo dat applicaties die in WPF ontwikkeld werden nog steeds gebruik kunnen maken van onderdelen van Windows Forms. Zoals gezegd zijn er voor deze Windows Forms veel meer controls beschikbaar dan er voor het ogenblijk voor WPF zijn. De DataGridView control die sinds versie 2.0 van het.net Framework bestaat heeft nog geen variant binnen WPF. Daarnaast zijn er vele pakketten met controls te koop die door externe bedrijven zijn gemaakt. Zolang deze situatie blijft is het dus nodig dat deze Windows Forms controls binnen WPF kunnen gebruikt worden. Daarnaast kan het ook interessant zijn om binnen Windows Forms applicaties een aantal onderdelen van WPF te gebruiken. Het is dan ook de bedoeling om dit mogelijk te maken zonder dat de gebruiker hier iets van merkt. Om Windows Forms controls te gebruiken binnen een WPF applicatie is er de WindowsFormHost control. Het is ook mogelijk om hierbinnen ActiveX controls te hosten waardoor WPF toegang krijgt tot een uitgebreide bibliotheek van bestaande controls. Op dezelfde manier kan een Windows Forms applicatie WPF controls gebruiken binnen de ElementHost control. De tools die voor elke technologie beschikbaar zijn kunnen ook voor de andere technologie gebruikt worden. Er zijn echter wel enkele beperkingen bij het combineren 147

150 Windows Presentation Foundation van deze twee technologieën. Een WPF control bovenop een Windows Forms control leggen is niet mogelijk, de Windows Forms control zal altijd bovenop verschijnen. Ook transparantie effecten zullen niet goed weergegeven net als transformaties. Daarnaast vereisen de Host controls full trust dus deze kunnen niet als XBAP ingezet worden. Daarbuiten zal het wel mogelijk zijn voor de meeste applicaties om deze technologieën te combineren binnen hun user interface Win32/MFC Voor de release van het.net Framework in 2002 werden de meeste user interfaces voorzien van directe calls naar Win32 APIs of MFC, die een C++ wrapper waren rond deze APIs. Er zijn dus nog veel applicaties te vinden met deze code erin, de vraag is natuurlijk wat ermee moet gebeuren bij het overgaan naar WPF. Net zoals bij de Windows Forms omgeving kunnen WPF controls gehost worden binnen Win32/MFC code en bestaande Win32/MFC controls kunnen gebruikt worden binnen WPF. De mogelijkheden die er zijn om dit met Windows Forms elementen te doen zijn namelijk gebaseerd op deze interactie met Win32/MFC code. Binnen WPF is er de HwndHost klasse om Win32/MFC controls te gebruiken en de HwndSource laat toe om WPF controls te gebruiken in een Win32/MFC applicatie. Deze klassen zorgen voor de nodige mapping tussen de twee technologieën. Net zoals bij Windows Forms zijn er natuurlijk een aantal beperkingen door de combinatie van deze twee technologieën. Zoals gezegd is de samenwerking op Win32/MFC gebaseerd dus de beperkingen bij Windows Forms gelden hier ook. Daarnaast komt er de extra moeilijkheid om WPF managed code te laten samenwerken met de unmanaged code van Win32. Het is ook daarom dat deze applicaties ook niet als XBAP kunnen geïmplementeerd worden. Het zorgt er wel voor dat voor traditionele Windows applicaties de bestaande code van een interface niet volledig moet herschreven worden Direct3D Direct3D, een deel van de DirectX familie van APIs, is de standaard oplossing voor Windows applicatieontwikkelaars die driedimensionele graphics willen maken. Het gebruik van WPF maakt Direct3D echter niet overbodig, zoals eerder gezegd werkt WPF met Direct3D voor het renderen. Ontwikkelaars die 3D willen opnemen in hun applicaties zullen dus moeten kiezen. De beslissing is echter niet zo moeilijk. Van zodra er intensieve 3D ontwikkeling nodig is zoals bij games en 3D technische applicaties blijft Direct3D de beste keuze. WPF is voorlopig niet bedoeld om deze technologie te vervangen. Wat wel de bedoeling is van WPF is om 3D voor een veel breder publiek toegankelijk te maken. Zo kan elke applicatie een driedimensioneel aspect bevatten zonder dat er daarvoor gespecialiseerde ontwikkelaars aan te pas komen. 148

151 Windows Presentation Foundation Daarnaast is het ook mogelijk om binnen een WPF applicatie Direct3D code te hosten via de HwndHost classe. WPF en Direct3D hebben dus verschillende rollen en kunnen alle twee perfect naast elkaar blijven bestaan op het Windows platform AJAX / Atlas Door het gebruik van AJAX is het voor ontwikkelaars mogelijk om browser cliënts te maken die beter handelbaar zijn voor gebruikers. Het maakt het mogelijk om bepaalde acties uit te voeren op een pagina zonder dat deze daarvoor een page refresh nodig heeft, en dus naar de server moet. Om dit mogelijk te maken gebruikt AJAX de browser ondersteuning voor het XMLHttpRequest object, dat al bestaat sinds Internet Explorer 5.0. Ondertussen is deze functionaliteit wijdverspreid. Het is echter niet zo eenvoudig om AJAX clients te maken dus heeft Microsoft een verzameling technologieën gecreëerd die hierbij kunnen helpen. Atlas is een set van bibliotheken, controls en meer om AJAX applicaties te creëren. Het bevat een client script bibliotheek die kan werken in verschillende browsers en server-extensions voor ASP.NET. Zo moet het eenvoudiger worden om AJAX cliënts te ontwikkelen. Doordat vele browsers deze technologie ondersteunen is het een aantrekkelijke keuze voor ontwikkelaars. Hoewel het hiermee mogelijk is om betere interactieve user interfaces te maken voor webgebruikers voegt het niets toe aan de mogelijkheden voor de inhoud van pagina s. Bij het kiezen tussen AJAX en WPF zal het er dus voornamelijk over gaan of er nood is aan ondersteuning voor audio, video, animaties en dergelijke. Als deze nodig zijn binnen de applicatie zal er dus eerder voor WPF gekozen worden en dan meestal als XBAP Microsoft Silverlight of WPF / E Om XBAPs te kunnen gebruiken moet op de cliënt machine WPF en dus het.net Framework 3.0 geïnstalleerd zijn. WPF/E is er om ook voor cliënts die geen WPF ondersteunen aantrekkelijke interfaces te maken voor web applicaties. Deze hebben enkel een browser plugin nodig die klein is en dus snel gedownload kan worden. De naam staat voor WPF Everywhere en voorziet in een deelverzameling van de mogelijkheden van WPF die op verschillende cliëntplatformen beschikbaar zijn, en vanuit verschillende browsers zoals Internet Explorer, Firefox en Netscape. De belangrijkste onderdelen die overgenomen worden van WPF zijn de tweedimensionale graphics, video en animatie. Een aantal mogelijkheden zijn echter weggelaten zoals de driedimensionale graphics, documenten en de hardware versnelling. In een volgende versie, 1.1, zal een subset van de 3.5.NET Runtime gebruikt worden wat een nieuwe generatie internetapplicaties zal mogelijk maken. Het is dan ook de bedoeling om een vervanger te zijn voor de huidige ASP.NET applicaties. Het gemakkelijke verspreiden van applicatie blijft en ontwikkelaars kunnen volop gebruik maken van de functionaliteit die ze van 149

152 Windows Presentation Foundation stand-alone applicaties gewoon zijn. Het voordeel van Silverlight ten opzicht van XBAP s zit erin dat enkel de.net runtime moet geïnstalleerd worden in plaats van het volledige Framework. Om een WPF/E applicatie te maken kan een ontwikkelaar Javascript gebruiken. Er zal ook een onderdeel van het.net platform in verwerkt worden waardoor ontwikkeling ook mogelijk zal zijn in C# en Visual Basic. Deze technologie maakt echter geen deel uit van het.net Framework 3.0, dat is ook de reden dat deze pas later zal uitgebracht worden. Van zodra ze beschikbaar is zal het een extra keuze zijn voor ontwikkelaars die web applicaties ontwikkelen en zal meer in de smaak vallen bij projecten die voor een breed spectrum van platformen zullen worden ingezet. Voorlopig kunnen ontwikkelaars de 1.0 bèta of de 1.1 alpha versie proberen, het wordt verwacht dat de officiële release midden 2008 zal zijn Windows Xp & Windows Vista Naast het combineren van WPF met andere grafische technologieën is het ook interessant om na te gaan wat de verschillen zijn tussen WPF op een Windows Xp machine en op een Windows Vista machine. Voor de volledigheid moet ook gezegd worden dat een Windows 2003 toestel dezelfde mogelijkheden heeft als een Windows Xp machine voor zover het gaat over WPF. Gelukkig zijn de verschillen hier zeer beperkt omdat dit van bij de ontwikkeling één van de doelstellingen was. Voor Microsoft was het zeer belangrijk dat dezelfde WPF code zonder aanpassingen op Xp en Vista zou draaien. Natuurlijk zal Vista voor vele gebruikers de weg zijn naar WPF aangezien het.net Framework 3.0 hier standaard op geïnstalleerd staat. Voor Xp is dit framework als een optionele update te verkrijgen via Windows Update of wordt het automatisch geïnstalleerd bij de eerste keer dat een XBAP bezocht wordt. Dit lijkt misschien een detail maar het zal er wel voor zorgen dat WPF zonder problemen een breed publiek kan bereiken. Zoals gezegd zijn de verschillen tussen WPF op Xp en Vista beperkt maar volgende zaken maken een upgrade toch het overwegen waard: Met de Desktop Window Manager (DWM) en een WDDM-klasse display driver wordt video RAM gevirtualiseerd zodat men zich geen zorgen moet maken dat WPF in software rendering mode zou overgaan bij een tekort aan ruimte. 3D anti-aliasing is beschikbaar op Windows Vista met een WDDM driver. Er is werk gemaakt van de intergratie met andere onderdelen van het platform die gebruik maken van MIL, hierdoor kan het vergrootglas binnen Vista bijvoorbeeld gebruik maken van vectorafbeeldingen in plaats van bitmaps. WPF animaties op Vista zouden vloeiender moeten gaan als DWM gebruikt wordt. Voor de tablet pc s zijn een aantal features toegevoegd om bewegingen te ondersteunen. 150

153 Windows Presentation Foundation Bij het remoten tussen twee toestellen die op Windows Vista draaien in combinatie met DWM zal de client side van een WPF applicatie hardware acceleratie kunnen gebruiken. Van zodra één van de toestellen echter op Windows XP draait valt deze ondersteuning weg en wordt opnieuw op bitmap remoting overgeschakeld. Het performantie verschil zal afhangen van de complexiteit van de interface en het gebruik van animaties. De reden dat dit sneller kan gaan is omdat in plaats van bitmaps de boomstructuur met alle visuele elementen wordt doorgestuurd, waarna deze op de client wordt weergegeven. Het serialiseren en doorsturen van een aantal objecten kan dan ook veel sneller gaan dan het nemen van screenshots en deze te verzenden. Naast een verschil in mogelijkheden kunnen we ook kijken naar een eventueel verschil in performantie tussen een WPF applicatie op Xp en op Vista. Het moet gezegd worden dat het verschil daartussen verwaarloosbaar is. We merken dat de grafische kaart de belangrijke factor is voor het goed werken van complexe WPF applicaties. Wat wel te verwachten is dat bij het ontbreken van een goede grafische kaart op een Vista systeem de performantie van de WPF applicaties lager zal liggen. De processor moet dan namelijk zowel de interface van Vista als de applicatie vanuit software renderen terwijl het aandeel van de Xp interface te verwaarlozen zal zijn. Dit kan echter opgelost worden door een deel van de grafische mogelijkheden van Vista uit te schakelen waardoor meer ruimte vrij komt voor de applicatie. Ongeacht deze kleine verschillen blijft de code die geschreven wordt hetzelfde. Wat wel kan is het toevoegen van mogelijkheden aan applicaties die gebruik maken van de nieuwe Shell mogelijkheden van Vista. Indien dit het geval is moet dit wel op de juiste manier opgevangen worden bij het gebruiken van de applicatie op een Windows Xp systeem Besluit Als we kijken naar alle nieuwe mogelijkheden binnen WPF dan kunnen we niet ontkennen dat dit een goed product is. Het is een nieuwe, krachtige manier van interfaces ontwikkelen die vele mogelijkheden beschikbaar stelt aan alle ontwikkelaars. Ook die nieuwe manier van ontwikkelen door de combinatie van XAML en code is zeker een grote vooruitgang. Het nadeel van al dit nieuws is echter wel dat de drempel om er mee te leren werken vrij hoog ligt. Het vraagt een grote aanpassing in de manier van denken over interfaces en dit maakt het in eerste instantie moeilijk. Van zodra een ontwikkelaar er echter mee vertrouwd is zal hij zich bewust worden van de vele mogelijkheden en zal al snel niet meer terugwillen naar vorige technologieën. Het is natuurlijk zo dat voor vele applicaties al deze uitgebreide animaties niet nodig zijn, het is dan ook te verwachten dat er nog lange tijd Windows Forms applicaties zullen ontwikkeld worden, al dan niet met WPF. 151

154 Windows Presentation Foundation Het belangrijkste om te onthouden bij WPF is vooral dat het een nieuwe manier van ontwikkelen aanbiedt en dat dit de echte kracht is. De mooie interfaces die ermee gemaakt kunnen worden horen er natuurlijk bij maar het is vooral de manier waarop dit kan die vernieuwend is. 152

155 CardSpace Hoofdstuk 4 CardSpace 4.1. Inleiding Wie ben jij? Het is een simpele vraag, maar het antwoord is niet altijd even simpel. We hebben verschillende manieren om onze identiteit aan te tonen. In een luchthaven gebruiken we een paspoort om aan te tonen dat we een burger zijn van een bepaald land. Op de weg gebruiken we een rijbewijs om aan te tonen dat we gewettigde autobestuurders zijn. Bij betalingen gebruiken we onze bankkaart om te aan te tonen dat we een rekening hebben bij een bepaalde bank. Zoals je ziet zijn er veel contexten waarin we een identiteit gebruiken en elk van deze contexten heeft zijn eigen manier van uitdrukken en biedt verschillende informatie. Het gebruik van deze identiteiten in de echte wereld is goed ingeburgerd en dit systeem werkt goed. In de computernetwerk wereld (bvb. het internet) is dat een heel ander paar mouwen. Net zoals in de echte wereld gebruiken we over een netwerk verschillende identiteiten die meestal ook elk hun eigen manier van gebruik hebben. Helaas is er vandaag de dag geen systeem om al deze identiteiten te beheren. Dus moeten de gebruikers zelf zorgen voor het beheer. Wat bij de meeste gebruikers resulteert in een lijstje van gebruikersnamen en paswoorden (soms met een Post-it op het scherm). Dit is natuurlijk allesbehalve een veilige oplossing. De ideale oplossing zou natuurlijk zijn mochten we één identiteit hebben voor gans de netwerkwereld. Dit is helaas niet mogelijk. Er zal altijd een nood zijn aan verschillende identiteiten en de meeste van die identiteiten zullen uitgereikt worden door verschillende instanties (overheid, banken, ). Een betere oplossing is het maken van een systeem om deze verschillende identiteiten te beheren: een identiteit metasysteem (systeem voor systemen). Om een dergelijk systeem op te zetten is samenwerking nodig want het is onmogelijk voor één organisatie om dit op te zetten. Gelukkig bestaan er onafhankelijke protocollen waarmee het mogelijk is om een dergelijk systeem op te zetten dat niet afhankelijk is van één organisatie. Microsoft speelt in samenwerking met andere organisaties een belangrijke rol in het creëren van een identiteit metasysteem. Zo heeft het CardSpace toegevoegd aan Windows om er mee voor te zorgen dat het identiteit metasysteem tot stand zou komen. CardSpace is een systeem waarmee gebruikers hun verschillende identiteiten op een veilige en gebruiksvriendelijke manier kan gebruiken en beheren. CardSpace is beschikbaar voor Windows XP, Vista en Server

156 CardSpace Het doel is om alle mensen, op iedere machine, die om het even welk OS draaien, veilig en gebruiksvriendelijk met digitale identiteiten te laten werken. Windows wordt op veel systemen gebruikt dus speelt CardSpace een belangrijke rol in het slagen van het identiteit metasysteem. Toch is het belangrijk dat ook andere organisaties op de kar springen zodat het doel bereikt kan worden Wat is Identiteit? Bij de term identiteit denken de meeste enkel aan de naam van een persoon. Maar ook andere zaken kunnen tot de identiteit van iets of iemand behoren: fysiek voorkomen, geschiedenis, geloof, voorkeuren, Een identiteit kan uitgedrukt worden als een verzameling van uitdrukkingen. Ik kan bvb. mijn eigen identiteit (gedeeltelijk) uitdrukken als: Ik ben Belg Mijn moedertaal is Nederlands Ik ben ouder dan 18 Ik speel tennis Ik heb een bankrekening bij Fortis Ik heb een rijbewijs Kortom, alles wat je over iemand kan zeggen hoort bij zijn identiteit Digitale identiteit Net zoals identiteiten in de reële wereld komen digitale identiteiten voor in verschillende vormen. Wanneer we bvb. een Hotmail account hebben, dan identificeren we ons aan de hand van een adres en een paswoord. Je kan een account hebben bij Amazon waar je jezelf identificeert aan de hand van een zelf gekozen gebruikersnaam en een paswoord. Op het werk gebruik je een digitale identiteit die beheerd wordt door bvb. Active Directory. Er zijn ook hier goede redenen om verschillende identiteiten te gebruiken in een verschillende context. Zo zal per identiteit de informatie die deze bevat verschillen. Zo kan een identiteit bij Amazon toegang verlenen tot nummer van een Visa kaart. Uiteraard mag dit niet het geval zijn bij bvb. Hotmail. Ook de manier waarop je een identiteit verkrijgt kan verschillen. Bij Amazon kies je zelf je gebruikersnaam en paswoord terwijl op het werk je meestal een gebruikersnaam krijgt van de administrator. Alle verschillende soorten identiteiten hebben wel één ding gemeenschappelijk: wanneer ze over een netwerk worden getransporteerd, gebeurt dit onder de vorm van een security token. Een security token is een reeks van bytes die informatie van de identiteit bevat. Deze informatie bestaat uit een reeks van claims. Ieder claim bevat een stukje van de totale identiteit. Ieder element uit de opsomming in de vorige paragraag zou een claim kunnen zijn. 154

157 CardSpace Figuur 80: Security tokens bestaande uit verschillende claims Het werken met claims biedt heel wat flexibiliteit. We kunnen zelf bepalen welke informatie we over onszelf vrijgeven. Zeker in de wereld van het internet probeert iedereen zo anoniem mogelijk te blijven. Als we bvb. toegang willen tot een goksite moeten we onze leeftijd bewijzen om toegang te krijgen. Maar andere zaken zoals adres en woonplaats hoeven we niet te geven. (Bij CardSpace kan je zelf bepalen welke claims je doorstuurt, maar ook de instantie naar waar naar je de informatie moet sturen kan bepalen welke inhoud er minimum moet doorgestuurd worden. Stuur je de gevraagde claims niet door, dan is het onmogelijk een geldige login te verkrijgen). Claims kunnen door iedereen verstuurd worden, dus moet een ontvanger kunnen controleren of de ontvangen claims effectief behoren tot de persoon die ze heeft verstuurt. De eenvoudigste en meeste gebruikte manier is door een paswoord mee te sturen met de claims (bvb. Hotmail login). Het kan echter veiliger: alle claims digitaal ondertekenen door gebruik te maken van de private sleutel van de verzender. De ontvanger kan dan met de publieke sleutel de handtekening verifiëren. Hoe het ook gebeurt, de security tokens bevatten meestal informatie zodat de ontvanger het token kan verifiëren. De basis van security tokens is dezelfde: het is een verzameling van claims. In de praktijk worden echter verschillende standaarden gebruikt om deze tokens voor te stellen. Het eenvoudigste voorbeeld is een gebruikersnaam (als string) vergezeld van een paswoord. Meer complexe formaten zoals X.509 certificaten en Kerberos tickets worden gebruikt wanneer de security eisen groter zijn. Deze formaten zijn echter niet ontworpen om een willekeurige set van claims te bevatten. Wat in sommige gevallen wel handig kan zijn (denk maar aan het voorbeeld van de goksite). We kunnen echter ook tokens gaan creëren door gebruik te maken van Security Assertion Markup Language (SAML). Dit is een standaard die gebaseerd is op XML en biedt de mogelijkheid om security tokens te creëren met de gewenste claims. X.509 certificaten en Kerberos tickets leggen de focus grotendeels op authenticatie. Maar het is belangrijk in te zien dat een digitale identiteit veel meer inhoud dan enkel authenticatie. Een rekeningnummer gaan men niet gebruiken voor authenticatie maar in sommige gevallen kan het 155

158 CardSpace nodig zijn dat deze is opgenomen in de digitale identiteit. Hiervoor is het nodig dat we zelf kunnen bepalen welke informatie(claims) we in onze digitale identiteit gaan opslaan Identiteit metasysteem In de inleiding werd reeds aangetoond dat we altijd nood zullen hebben aan verschillende identiteiten. Zowel in de echte als in de netwerkwereld. Zoals in de inleiding reeds gezegd, zou het in plaats van nog een standaard uit te vinden voor het creëren van digitale identiteiten, veel nuttiger zijn om een systeem te hebben die toelaat deze verschillende identiteiten te beheren en te gebruiken: een identiteit metasysteem. Belangrijk hierbij is dat het metasysteem niet afhankelijk is van een organisatie. Het is niet Microsofts of IBMs identiteit metasysteem, het is het identiteit metasysteem Rollen Er zijn 3 rollen in het metasysteem: Subjects: hiermee worden digitale identiteiten geassocieerd. Dit kunnen naast personen ook groepen, computers, zijn. Identity Providers: bezorgt een digitale identiteit aan een gebruiker. Als werknemer van een bedrijf zal je meestal een digitale identiteit krijgen via de administrator. Als klant bij een bank zal de bank de gebruiker een digitale identiteit bezorgen. Bij een site als Amazon krijg je geen digitale identiteit maar je maakt er zelf één aan door alle gegevens op de site in te vullen en een gebruikersnaam en paswoord te kiezen. Digitale identiteiten kunnen dus door de gebruiker zelf of door een derde partij gecreëerd worden. Relying Parties: is een applicatie die op een of andere manier gebruik maakt van een digitale identiteit. Dit kan bvb. dienen om een gebruiker al dan niet toegang te geven tot een site, een rekeningnummer van een gebruiker te bekomen, de leeftijd van de gebruiker te weten te komen,. Ter illustratie even een voorbeeld van de verschillende rollen: wanneer ik bij Amazon online een boek koop met mijn kredietkaart ben ik het subject, is de website van Amazon de relying party en is mijn bank de identity provider. In dit voorbeeld kan de website eisen dat claims: naam, adres en kredietkaartnummer zijn ingevuld. Dan kan ik aan mijn bank vragen me een token te bezorgen met deze claims met het bewijs dat het door de bank is uitgegeven en dat ik de eigenaar ben van het verstuurde token. Als de website dan dit token ontvangt, controleert deze of het effectief van de bank afkomstig is en of ik effectief de eigenaar ben het token. Hierbij is het belangrijk dat de gebruiker centraal staat. Het token kon ook rechtstreeks van de bank naar de website zijn gegaan maar het gaat 156

159 CardSpace van de bank naar de gebruiker en dan naar de website. Op die manier behoudt de gebruiker de controle over wanneer zijn identiteit gebruikt wordt. Wanneer we het voorbeeld van naderbij bekijken zien we dat het metasysteem aan enkele eisen moeten voldoen. Ten eerste moet de relying party kunnen specifiëren welke claims hij nodig heeft op een manier waarop iedereen dit verstaat. Ook de identity resolver moet op een gelijkaardige manier kunnen specifiëren welke claims hij kan aanbieden. Ten tweede is het mogelijk dat de relying party en de identity resolver elk een eigen identiteitssysteem gebruiken (we zijn hier bezig met een metasysteem). Dus hebben beide een manier nodig om te kunnen zeggen welk soort tokens (bvb. SAML 2.0 tokens) ze aanvaarden/aanbieden. Verder zou het ook handig zijn als de relying party en de identity resolver kunnen onderhandelen over welke types tokens er gebruikt wordt. De ene zegt: Ik gebruik types X en Y en de andere zegt: Ik gebruik types Y en Z. Dan zal type Y gebruikt worden omdat beiden deze kunnen gebruiken. Dit kan vergeleken worden met twee personen die elk een vreemde taal spreken. De ene spreekt Nederlands en Engels terwijl de andere Frans en Spaans spreekt. Als er een tolk Spaans-Engels aanwezig is, is communicatie toch mogelijk (op voorwaarde dat de tolk alles goed en in de juiste context vertaalt). Dit principe kunnen we ook toepassen met onze digitale identiteiten. Het volstaat niet om het ene token in het andere te vertalen want het kan ook nodig zijn dat de claims vertaald moeten worden: bvb. wanneer een identity resolver een claim heeft met de geboortedatum terwijl de relying party een claim ouder dan 21 eist, dan moet dit ook vertaald worden. Wat we hiervoor nodig hebben is een betrouwbare service die tokens kan ontvangen van het ene type, en kan vertalen naar het andere type. Deze services bestaan en heten security token services (STS). Meestal zullen de identity resolvers de rol van STS op zich nemen Architectuur De architectuur die ons in staat stelt om het tot nu toe besproken metasysteem te creëren is de WS-* Web Services architectuur. Dit is een open standaard die reeds wijdverspreid wordt gebruikt in de industrie. WS-* bevat een aantal specificaties waarvan er al enkele werden besproken bij 1.3. Troeven van WCF. De specificaties die bij dit metasysteem gebruikt worden zijn: WS-SecurityPolicy, WS-MetadataExchange (WS-MEX) en WS-Trust. Met WS-SecurityPolicy kunnen we de claim eisen/mogelijkheden beschrijven van de relying party/identity provider. Met WS-MEX kunnen we deze versturen en opvragen. WS-Trust 157

160 CardSpace definieert het mechanisme om tokens aan te vragen en te versturen. Deze architectuur wordt samengevat in Figuur 81. In de figuur zien we dat door het gebruik van een Security Token Server, identity providers zowel met Kerboros als X.509 certificaten kunnen werken. Wanneer we ons willen aanmelden bij een identity provider gebeurt het volgende: we vragen zijn policy (hierin staan welke claims vereist zijn) via WS-Security-Policy. De identity selector is een grafische interface die zorgt dat de gebruiker eenvoudig en snel een bepaalde identiteit kan selecteren. Ook zorgt deze voor de onderhandeling tussen identity provider en relying party over welke types tokens wordt gebruikt. De identity selector zal enkel de identiteiten afbeelden die voldoen aan de policy. Dit kan zijn dat hij een token eist die komt van een bepaalde identity provider, maar het kan ook zijn dat hij eist dat een bepaalde claim is opgenomen in het token (bvb. de leeftijd) CardSpace systeem Figuur 81: Identiteits Metasysteem architectuur CardSpace is een identity selector die door Microsoft werd ontwikkeld. CardSpace is dus een implementatie van een stukje van het identiteit metasysteem. Let wel, het is een implementatie. Verwacht wordt dat ook andere operating systems zoals Linux en Mac OS, een identity selector zullen krijgen. Dit zal nodig zijn om het totale project van het metasysteem te doen slagen Belangrijkste eigenschappen van CardSpace De vier belangrijkste aspecten zijn: Ondersteunen van elk digitaal identiteitssysteem Gebruiksvriendelijke en veilige controle over verschillende digitale identiteiten Vervanging van paswoord-login Verhoogde betrouwbaarheid van identiteit van websites 158

161 CardSpace In volgende stukje wordt beschreven hoe CardSpace aan elke eigenschap voldoet Ondersteunen van ieder digitale identiteit systeem Zoals eerder vermeld gebruiken we verschillende identiteiten die allemaal van een andere bron afkomstig zijn. Het is dus heel goed mogelijk dat vele identiteiten op een verschillend systeem zijn gebaseerd (X.509 certificaten, SAML, ). Het is dus belangrijk dat wanneer een gebruiker met CardSpace werkt, hij al zijn identiteiten moet kunnen gebruiken. Daarom moet CardSpace met alle systemen kunnen werken. Voor CardSpace maakt het niet uit welk formaat het security token heeft dat aangevraagd wordt door de relying party en wordt verstuurd vanuit de identity provider. CardSpace is zelf niet op de hoogte van het gebruikte formaat. Hierdoor kan CardSpace werken met ieder digitale identiteit systeem en ieder type van security tokens. Indien er in de toekomst nieuwe formaten op de markt komen, zal CardSpace ook hier geen problemen mee hebben Gebruiksvriendelijke en veilige controle over verschillende digitale identiteiten De protocollen om security tokens te versturen en te ontvangen hebben we. Maar de gebruiker moet ook begrijpen welke identiteiten deze tokens voorstellen. De gebruiker moet het systeem eenvoudig kunnen gebruiken en moet er ook vertrouwen in hebben. Zonder dit alles zal het project zowiezo falen want het is uiteindelijk de gebruiker die het moet gebruiken. Het is de bedoeling dat iedere gebruiker dit systeem kan gebruiken, van huisvrouw/man tot IT-specialist (wat niet kan gezegd worden van X.509 certificaten en dergelijke waar de drempel hoger ligt). Hiervoor gebruikt CardSpace een intuïtieve grafische interface om met de verschillende digitale identiteiten te werken. Figuur 82: CardSpace Identity Selector Zoals op de screenshot te zien is, wordt iedere identiteit voorgesteld als een kaart, een information card. Iedere card stelt een digitale identiteit voor en bevat ook informatie over de 159

162 CardSpace digitale identiteit. Deze informatie bevat gegevens over welke identity provider er moet gecontacteerd worden om een security token te verkrijgen, welk soort tokens de identity provider kan aanbieden en welke claims hij kan aanbieden. Wanneer een gebruiker op een card klikt, dan vraagt hij in feite een token aan met een specifieke set van claims, bij een specifieke identity provider. Hierbij blijft de complexiteit voor de gebruiker verborgen en kan die dus eenvoudig en veilig werken met zijn verschillende digitale identiteiten. Om een betere beveiliging te creëren is het ook mogelijk een PIN code op een card te plaatsen. Vooraleer een card kan gebruikt worden, moet dan een PIN code ingegeven worden. Ook wordt CardSpace weergegeven in een private Windows Desktop. Dit wil zeggen dat je niets anders kunt doen totdat je identiteitsselectie is afgelopen of geannuleerd door de gebruiker. Het gebruik van een private desktop zorgt er ook voor dat een ander lokaal proces geen misbruik kan maken van de identiteitsgegevens Vervanging van paswoord-login Vandaag is het meest gebruikte security token op het Internet een gebruikersnaam. Om te bewijzen dat de opgegeven gebruikersnaam effectief tot de gebruiker behoort, wordt deze vergezeld van een paswoord. Meestal gebruikt de website in kwestie dan SSL om met de browser te communiceren. Op die manier is het verkeer tussen browser en website geëncrypteerd en kan een aanvaller dus moeilijk de gebruikersnaam en paswoord achterhalen door de lijn af te luisteren. Wanneer een paswoord goed gekozen is en de gebruiker niet al te omslachtig omspringt met zijn paswoorden, biedt dit een goede beveiliging. Toch houdt dit systeem enkele gevaren in: Phishing: hierbij wordt een gestuurd naar een gebruiker waarbij men de gebruiker probeert te misleiden zodat hij zijn gebruikersnaam en paswoord ingeeft op een site die een kopie is van een echte site. Om een eenvoudig voorbeeld te geven: een puber ontvangt een mailtje op zijn Hotmail adres waarin staat dat hij als Hotmail-lid 1000 gratis ringtones kan krijgen als hij onmiddellijk inlogt op een pagina waarvan de link in de is vermeld. Mensen met een beetje ervaring op het internet zullen hier natuurlijk niet in trappen. Maar als de site ongeveer hetzelfde uiterlijk heeft als die van Hotmail, zullen er zeker enkele nietsvermoedende gebruikers hun gebruikersnaam en paswoord invullen op die site en ze op die manier bezorgen aan mensen die daar misbruik willen van maken. Dit is nu een onschuldig voorbeeld met een Hotmail adres, maar op deze manier wordt ook geprobeerd om bvb. zoveel mogelijk mensen hun Visa gegevens te weten te komen. Een variant op phishing is pharming. Hierbij wordt een DNS server aangevallen om op die manier het internetadres van een bepaalde domeinnaam te veranderen in dat van een kopie. Ook hier is het weer de bedoeling dat de gebruikers hun gegevens invullen op die kopie. 160

163 CardSpace Een ander probleem is het toenemende aantal sites waar men geregistreerd is. Voor ieder forum, mailbox, moet men een gebruikersnaam en paswoord hebben. Dit lijstje wordt steeds langer. Telkens dezelfde gebruikersnaam en paswoord gebruiken is zeker niet veilig, want als je paswoord voor één site geweten is, ligt de baan open naar andere sites. Telkens een andere gebruikersnaam en paswoord kiezen wordt dan weer ingewikkeld waardoor het voor sommigen nodig is deze op papier of in een bestand bij te houden. Ook dit is natuurlijk geen veilige oplossing. In plaats van authenticatie door middel van een paswoord, kan een website ook gebruik maken van security tokens. Als een bedrijf bijvoorbeeld meerdere websites heeft waar een login voor nodig is, kan dit bedrijf een identity provider aanbieden die tokens levert die door alle websites van dat bedrijf aanvaardt worden. Op die manier moeten geen paswoorden meer worden gebruikt en kan CardSpace gebruikt worden. Natuurlijk lost dit het probleem maar op voor die groep van websites. Er zijn natuurlijk ook websites waar de gebruiker zelf zijn gebruikersnaam en paswoord kiest. Dit is de meest voorkomende manier van werken door zijn eenvoud: er is geen derde partij in betrokken. Hiermee is de website wel niet zeker dat de gebruiker is wie hij beweert te zijn (bij registratie kan iedereen invullen bij naam, adres, wat hij maar wil). Maar meestal is dit bij dit type sites niet nodig. Men gebruikt dit type login gewoon om een gebruiker te herkennen wanneer hij zich aanmeldt. Al wat hiervoor nodig is, is een unieke digitale identiteit voor een gebruiker. Dit hoeft niet noodzakelijk reële informatie over die gebruiker zijn maar kan bvb. een uniek nummer zijn. Hiervoor voorziet CardSpace een self-issued identity provider. Deze provider draait lokaal en is in staat self-issued information cards te creëren net zoals een iedere andere normale identity provider. Om beide types van elkaar te kunnen onderscheiden worden de normale (externe) identity providers managed identity providers genoemd en de cards die ze creëren, managed cards. Self-issued cards kunnen enkel wat basisinformatie bevatten zoals een gebruikersnaam, adres, geboortedatum,. Wanneer een gebruiker een self-issued card kiest, zal de self-issued identity provider een security token genereren (in SAML formaat) met de informatie die door de relying party (bvb. website) gevraagd wordt. Daarna zal de self-issued identity provider een sleutelpaar genereren en het token met de private sleutel digitaal ondertekenen. Ook zal een timestamp en andere informatie worden toegevoegd zodat er niemand later van deze token gebruik kan maken. Daarna stuurt de provider het ondertekende token, samen met de publieke sleutel naar de website. Deze kan met de publieke sleutel, de handtekening valideren om zo na te gaan of het om een geldig token gaat dat effectief afkomstig is van de rechtmatige eigenaar. Voor iedere website zal de identity provider een ander sleutel paar genereren zodat verschillende websites geen sleutels kunnen vergelijken om het surfgedrag van gebruikers in kaart te brengen. Enkel wanneer je een card voor het eerst gebruikt bij een website, wordt een 161

164 CardSpace sleutelpaar gegenereerd voor die website. Ook dit wordt voor de gebruiker verborgen gehouden om de complexiteit zo veel mogelijk te verbergen. Door het gebruik van self-issued cards wordt het gebruik van phishing dus moeilijker (o.a. door de timestamp) Verhoogde betrouwbaarheid van identiteit van websites Door het gebruik van paswoorden te vermijden, wordt het probleem van phishing kleiner maar het zal het niet elimineren. Een aanvaller kan nog steeds een gebruiker lokken naar zijn site en een security token accepteren dat van de gebruiker komt. Op die manier kan hij dus informatie bekomen over die gebruiker. De aanvaller zal weliswaar niet kunnen inloggen op de site die hij simuleert, maar kan wel nog adresgegevens en dergelijke te weten komen. De hoofdoorzaak van dit probleem is het feit dat gebruikers de kopie van een website niet kunnen onderscheiden van de originele website want kopies kunnen dezelfde logo s en layout gebruiken. Ze kunnen zelf SSL gebruiken om de communicatie te beveiligen want iedereen kan een certificaat aanvragen om zijn site te beveiligen. Op die manier kan een gebruiker dus een kopie van een bank-website bezoeken met een slotje onderaan de browser om aan te tonen dat de verbinding beveiligd is. Op die manier wordt het voor een modale gebruiker moeilijk te zien dat hij niet de originele website voor zich ziet. Voor de oplossing van het probleem is zijn twee zaken nodig: Een manier voor websites om zich beter te identificeren tegenover gebruikers Een manier om als gebruiker te weten hoe betrouwbaar een website is. Met andere woorden, in welke mate kan ik erop vertrouwen dat de identiteit van een website effectief klopt. Op basis hiervan kan een gebruiker dan beslissen of hij deze site al dan niet vertrouwt. Het identiteit metasysteem en ook CardSpace hebben aandacht voor beide zaken. Om ervoor te zorgen dat websites zich beter kunnen identificeren tegenover gebruikers, kunnen de certificaten verbeterd worden. Vandaag worden de meeste websites beveiligd met een certificaat voor SSL communicatie. Het is beter dan niets maar SSL certificaten bewijzen enkel dat een bepaalde website, een bepaalde DNS naam heeft. Een aanvaller kan dus best een certificaat hebben voor een DNS naam die heel erg lijk op die van het origineel. SSL certificaten volstaan hier dus niet. Om dit op te lossen is Microsoft met vele anderen uit de industrie aan het werken aan een nieuw certificaat met een hogere veiligheid. Deze certificaten worden high-assurance SSL certificaten genoemd. Dit certificaat kan meer informatie bevatten dan een SSL certificaat, zoals de naam, de lokatie en het logo van de organisatie waar het certificaat aan werd uitgereikt. Dit 162

165 CardSpace type certificaat zal ook moeilijker te verkrijgen zijn omdat er een grondigere controle zal zijn vooraleer een dergelijk certificaat zal worden uitgereikt. Het zal dus niet mogelijk zijn om als aanvaller een certificaat aan te vragen met het logo van een bepaalde bank. Om deze manier kunnen identity providers en relying parties zich op een hoog niveau identificeren tegenover gebruikers. Door deze nieuwe certificaten te gebruiken wordt het eerste puntje dus opgelost. Natuurlijk komt het erop neer dat de gebruiker een beslissing neemt om een site al dan niet te vertrouwen. CardSpace zal dit expliciet vragen aan de gebruiker. Telkens wanneer een gebruiker voor het eerst een website bezoekt met zijn card, wordt aan de gebruiker gevraagd of hij deze site al dan niet vertrouwt. Ook wanneer een managed card wordt geïnstalleerd wordt de gebruiker gevraagd of hij de organisatie die de card verleende vertrouwt. Stel dat je na enkele weken opnieuw wordt gevraagd of je een bepaalde site vertrouwt kan dit sterk op phishing wijzen. Wanneer de gebruiker een beslissing moet nemen of hij een partij al dan niet vertrouwt en er worden high-assurance SSL certificaten gebruikt, dan ziet de gebruiker ook de naam, locatie, url en het logo van de organisatie. Dit kan helpen om een juiste beslissing te nemen. Internet Explorer 7 helpt de gebruiker ook een handje. Wanneer we een website bezoeken via een beveiligde verbinding, zal de adresbalk een aangepaste kleur krijgen. Rood: er is een fout opgetreden bij het certificaat, het certificaat dat gebruikt wordt is vervallen of is niet uitgereikt voor het gebruikte adres. Geel: de authenticiteit van het certificaat kan niet gecontroleerd worden. Wit: het certificaat is gevalideerd maar het is geen high-assurance SSL certificaat. Groen: het certificaat is gevalideerd en het is een high-assurance SSL certificaat. In een demo-website die later wordt besproken hebben we gebruik gemaakt van zo een highassurance SSL certificaat dat uitgereikt werd aan Figuur 83: Adresbalk bij website met geldig certificaat Onze lokale webserver is dus uitgerust met een certificaat voor het adres Wanneer we hem nu aanspreken via localhost krijgen we een fout en dus een rode adresbalk. Figuur 84: Adresbalk bij website met ongeldig certificaat Opm. Om van deze kleurcodes gebruik te kunnen maken is nodig de phishing filter aan te zetten in Internet Explorer. Dit kan via het Advanced tabblad van de Internet Options. 163

166 CardSpace Werking Nu de belangrijkste eigenschappen van CardSpace gezien zijn, kunnen we iets dieper ingaan op de werking ervan. Volgende figuur geeft de verschillende acties weer wanneer een client wenst in te loggen bij een relying party met een managed card. Wanneer de gebruiker een selfissued card zou gebruiken, speelt de client de rol van de identity provider. Figuur 85: Werking CardSpace 1) Client wil toegang tot een bepaalde bron van de relying party. 2) De relying party stuurt een policy terug met de eisen waaraan het security token moet voldoen. 3) CardSpace filtert de cards die aan de eisen voldoen. 4) De gebruiker selecteert de card die hij wenst te gebruiken 5) Via de gegevens uit de geselecteerde card, weet CardSpace met welke identity provider hij contact moet opnemen om een security token te verkrijgen. 6) De identity provider bezorgt een token aan de client. 7) De client geeft zijn goedkeuring om het token te versturen. 8) Het token wordt verstuurd naar de relying party. Op basis van dit token geeft de relying party dan al dan niet toegang tot de bron Information Cards Even ter herhaling, een information card is de voorstelling van een digitale identiteit binnen CardSpace, althans voor een gebruiker. Voor CardSpace is een information card een XMLdocument dat opgeslagen wordt op de machine van de gebruiker. Binnen dit stuk zullen we zien hoe deze cards kunnen verkregen worden en wat ze precies bevatten. 164

167 CardSpace Het verkrijgen van een information card Iedere information card wordt gecreëerd door een of andere identity provider. Wanneer je zelf een information card aanmaakt, dan speel je zelf de rol van identity provider. Hiervoor biedt CardSpace een grafische interface aan zodat gebruikers eenvoudig hun eigen cards kunnen aanmaken (zie Gebruik van CardSpace in de praktijk - Creëren van een self-issued card ). Externe identity providers kunnen cards aan gebruikers bezorgen via hun website, mail, USBpen,. Hoe ze bezorgd worden maakt in feite niet uit, zolang ze maar op de computer van de gebruiker terecht komen. Iedere card moet ook digitaal ondertekend zijn door de identity provider die de kaart uitgegeven heeft. Deze handtekening wordt gebruikt om de identiteit van de identity provider zelf te controleren. Om de handtekening te kunnen valideren wordt het certificaat van de identity provider meegeleverd met de kaart Welke informatie bevat een information card De informatie die in cards is opgeslagen heeft meerdere doelen. Ze zorgt ervoor dat relying parties gebruikers kunnen identificeren. Ze zorgt er ook voor dat CardSpace weet welke identity provider hij moet contacteren om een security token te aanvaarden. Tenslotte helpt ze ook de gebruiker een keuze te maken. Om al deze zaken mogelijk te maken bevat elke information card: De security token types die bij de identity provider kunnen aangevraagd worden. Met per type een lijst van mogelijke claims die kunnen worden aangevraagd. Adressen van een of meerdere endpoints (zie WCF) van een identity provider waar security tokens aangevraagd kunnen worden. Deze adressen eindigen meestel met /sts. Adressen van een of meerdere endpoints van een identity provider van waar de policy kan worden afgehaald. Deze informatie bepaalt o.a. hoe CardSpace zich moet identificeren tegenover de identity provider. Deze adressen eindigen meestel met /mex. Datum en tijd waarop de kaart werd gecreëerd. Een unieke id van de kaart. Deze wordt gegenereerd door de identity provider en wordt doorgegeven telkens een token wordt aangevraagd voor deze card. Een JPEG of GIF afbeelding zodat de gebruiker makkelijk onderscheid kan maken tussen de verschillende cards. Het is ook belangrijk welke informatie er niet wordt opgeslagen, zo wordt gevoelige informatie van een gebruiker niet opgeslagen in zo een card. Als je bvb. een card krijgt van een bank, dan zal het creditcard nummer niet opgeslagen worden in die card. Gevoelige informatie kan wel voorkomen in claims maar die informatie wordt opgeslagen bij de identity provider. In het voorbeeld wordt het creditcard nummer opgeslagen in het systeem van de bank. Samengevat 165

168 CardSpace wordt gevoelige informatie nooit opgeslagen op een lokaal systeem. Een gebruiker kan steeds de informatie die in een security token zal komen, vooraf bekijken. Deze informatie zal dan van de identity provider worden gehaald en eenmaal afgebeeld, direct van het lokale systeem verwijderd worden Roaming met information cards In sommige gevallen werken gebruikers op verschillende computers: een vaste pc thuis en/of op het werk en eventueel nog een laptop voor onderweg. Het zou natuurlijk te veel werk zijn om op iedere pc die cards te gaan aanmaken. Daarom kan je ook cards exporteren en dan doormailen of op een USB-pen opslaan. Deze kunnen dan op andere computers geïnstalleerd worden om op een zelfde manier gebruikt te worden. Maar wat als de USB-pen gestolen wordt? Om cards tijdens het transport te beschermen, worden ze geëncrypteerd met een sleutel die afgeleid is van een pass-phrase die door gebruiker wordt opgegeven. Wat als je CardSpace wil gebruiken in bvb. een internetcafé. Je zou dan je cards moeten installeren en daarna weer gaan verwijderen (want gegevens achterlaten op een publieke computer is uitgesloten). Dit is natuurlijk geen goede oplossing. Een goede oplossing zou zijn dat het mogelijk is een card te gebruiken vanop een USB-pen zonder dat deze lokaal moet geïnstalleerd worden. In de huidige versie van CardSpace is dit niet mogelijk maar het zou handig zijn mocht men dit in een volgende versie voorzien Revoken van information cards Met het revoken van een information card wordt bedoeld dat deze ongeldig wordt gemaakt. Als een identity provider een card bezorgt aan een gebruiker, hoe kan deze dan gerevoked worden. In het simpelste geval kan de identity provider zelf stoppen met het verlenen van security tokens. Het kan bvb. zijn dat het gaat om een betalende service en de gebruiker heeft al een tijdje zijn rekening niet betaald. De identity provider kan dit doen omdat iedere kaart een eigen unieke id heeft (zie Welke informatie bevat een information card). Wat als een gebruiker zijn card(s) wil revoken. Het kan bvb. zijn dat zijn laptop gestolen is. Als er cards niet beveiligd zijn met een PIN-code, kan de dief gebruik maken van deze cards. In dit geval zal de gebruiker zelf de identity provider op de hoogte moeten stellen (dit systeem is vergelijkbaar met Cardstop wanneer je je bankkaart kwijtraakt of gestolen wordt). Dit is niet in CardSpace geïntegreerd. De identity providers moeten dus zelf een systeem opzetten om deze dienst te verlenen. Wat met self-issued cards? Want als de computer gestolen is, is de identity provider ook gestolen. Dan zit er niets anders op dan alle sites waar de gebruiker een account heeft, op de hoogte te brengen. Daarom neemt men best nu en dan eens een backup van een kaart, want via die backup kan de gebruiker dan zien bij welke sites welke kaart gebruikt werd. 166

169 CardSpace 4.6. Gebruik van CardSpace in de praktijk - Gebruiker Configuratiescherm Op een Windows XP machine kan je de UI van CardSpace openen door het configuratie scherm te openen en dan CardSpace te selecteren. In het scherm dat geopend wordt, krijgt de gebruiker een overzicht van alle op het systeem aanwezige cards. Nog even vermelden dat CardSpace altijd geopend wordt in een private desktop (voor een betere security). Met andere woorden, wanneer CardSpace geopend is kan je niets anders doen. Nadeel is dat weer dat CardSpace zo nu en dan eens niet goed wil opstarten en je dan meestal je computer opnieuw mag opstarten. Figuur 86: CardSpace in private desktop Wanneer we een card selecteren en op Preview klikken, krijgen we meer informatie over de card. In dit voorbeeld maken we gebruik van een self-issued card (door het simpel feit dat ik nog geen enkele aanbieder heb gevonden van managed cards ). We zien de identiteitsgegevens maar ook de laatste sites waarvoor we de card gebruikt hebben en de datum wanneer de card gecreëerd werd. Wanneer het gaat om een self-issued card, kan men via de knop Edit de informatie aanpassen. Wanneer het gaat om een managed card, kan de gebruiker enkel de naam van de kaart aanpassen (deze speelt enkel voor de gebruiker een rol). Via View Card History kunnen we alle sites zien waar we de card hebben gebruikt. Dit kan handig zijn als er bvb. een diefstal is gebeurt en alle websites waar de gebruiker zijn card voor gebruikt op de hoogte gebracht moeten worden. Daarom is het handig om regelmatig een backup te nemen van alle cards en die op een ander medium op te slaan. 167

170 CardSpace Figuur 87: Details van een card Om een PIN-code op een card te plaatsen, kan de gebruiker op Lock card klikken. Dan wordt een PIN-code gevraagd aan de gebruiker. Telkens de gebruiker dan deze card wenst te gebruiken, moet deze PIN-code ingegeven worden. Verder kan je vanuit het hoofdscherm ook nog een backup nemen van een of meerdere cards. Je kan kiezen om van één of meerdere cards tegelijk een backup te nemen. Deze worden dan opgeslagen in een bestand met de extensie.crds. Om de inhoud van deze bestanden te beveiliging moet de gebruiker bij het nemen van een backup een paswoord ingeven. Dit paswoord is dan uiteraard nodig wanneer we de card(s) willen restoren. Zoals reeds eerder vermeld is het aan te raden om regelmatig een backup te nemen van de cards en op een andere locatie op te slaan voor het geval we relying parties moeten verwittigen als onze computer bvb. gestolen wordt Login Het is natuurlijk de bedoeling dat zoveel mogelijk websites en applicaties een CardSpace login gaan ondersteunen (met login bedoel ik niet alleen inloggen op een website maar bvb. ook toegang krijgen tot een bron). Wanneer je op een website of applicatie volgende afbeelding ziet (Figuur 88), dan ondersteunt deze website of applicatie, CardSpace. Figuur 88: Logo CardSpace 168

171 CardSpace Wanneer we inloggen met CardSpace krijgen we eerst volgend scherm te zien: Figuur 89: CardSpace identity selector CardSpace toont bovenaan de cards die reeds bij de deze relying party zijn gebruikt. Verder hebben we reeds gezien dat CardSpace alle cards filtert die voldoen aan de policy (eisen) van de relying party (website/applicatie). In dit voorbeeld willen we inloggen bij een website die eist dat alle standaard gegevens van een gebruiker ingevuld zijn. Bij Testcard is dit niet het geval. Je ziet dan ook dat de card uitgegrijsd is. Nu vraag je je misschien af, hoe kan deze card ooit gebruikt zijn als ze niet voldoet aan de eisen? Dit komt omdat de gegevens van deze card na gebruik bij deze relying party zijn aangepast. Wanneer we op deze card dubbelklikken zien we welke informatie vereist is om deze card te kunnen gebruiken. Via edit kunnen we deze informatie invullen en dan kunnen we wel de card gebruiken. Nog even herhalen dat het niet mogelijk is deze informatie te wijzigen bij een managed card. Figuur 90: Details van de card met onvolledige informatie Dubbelklikken we op een card die niet is uitgegrijsd, m.a.w. een card met alle vereiste informatie, dan krijgen we nog eens alle informatie te zien die effectief zal worden doorgestuurd naar de website. Dit zorgt ervoor dat de gebruiker altijd ziet wat naar de relying party gestuurd 169

172 CardSpace wordt. Wanneer de gebruiker op Send klikt, wordt de informatie effectief verstuurd naar de relying party. Figuur 91: Overzicht van de informatie die verstuurd zal worden In dit voorbeeld wordt enkel gebruik gemaakt van self-issued cards. Dit is te wijten aan het feit dat ik op dit moment nog geen enkel website heb gevonden die met managed cards werkt. Ook de websites die met self-issued cards werken zijn op dit moment op één hand te tellen. Hopelijk groeit dit aantal in de nabije toekomst Creëren van een self-issued card Wanneer men via het configuratiescherm op het hoofdmenu van CardSpace terecht komt, kan men daar kiezen voor Add Card. Hier kan men kiezen om een self-issued card te creëren of een managed card te installeren. Wanneer we voor self-issued kiezen krijgen we een scherm te zien waar de gebruiker zijn gegevens kan invullen. Hij is niet verplicht ze allemaal in te vullen. De gebruiker kan de card effectief creëren door op de knop Save te klikken. Figuur 92: Creëren van een self-issued card 170

173 CardSpace Installeren van een managed card Wanneer je een card ontvangen hebt (bestand met extensie.crd), kan de gebruiker hierop dubbelklikken om op die manier de card te installeren (of je kan kiezen voor Add Card > Install managed card). Hierbij zie je informatie over de card, de provider van de card en de instantie die de identiteit van de provider verifieert. Door een eenvoudige druk op de knop Install wordt de kaart geïnstalleerd. Wanneer de kaart geïnstalleerd is kan ze gebruikt worden om security tokens mee aan te vragen. Figuur 93: Installatie van een managed card Zoals je ziet is het gebruik van CardSpace echt kinderspel (het is bijna overbodig om dit te behandelen). Je moet geen computerspecialist zijn om het dagelijks te kunnen gebruiken. Dit was ook een doel van Microsoft en volgens mij zijn ze hier goed in geslaagd Gebruik van CardSpace in de praktijk Ontwikkelaar Om het gebruik van CardSpace voor een ontwikkelaar te bespreken is er een inlogapplicatie ontwikkeld die gebruik maakt van CardSpace. We beperken ons hier tot het gebruik van selfissued cards. De piste om zelf een identity provider te ontwikkelen werd onderzocht maar dit zou teveel tijd kosten. Ook voor Dolmen is CardSpace in dit onderzoek van ondergeschikt belang. Daarom heb ik me hier beperkt tot het creëren van een website die een login mogelijk maakt met het gebruik van self-issued cards Website met CardSpace login Wat werd ontwikkeld is dus een relying party die security tokens accepteert via CardSpace. Dit is een demoapplicatie. Het is dus geen realistische website met een mooi design en dergelijke maar gewoon een eenvoudige website om aan te tonen hoe je het gebruik van CardSpace kan toelaten op een website. Deze website werd ontwikkeld in ASP.NET. Verder wordt gebruik 171

174 CardSpace gemaakt van een SQL Server database met één tabel om de geregistreerde leden in op te slaan. Als primaire sleutel gebruik ik de unieke id van de card. Eerst wordt getoond hoe het programma werkt voor een gebruiker. Wanneer de gebruiker op de startpagina komt klik hij op de knop met het logo (Figuur 94). Dan verschijnt de identity selector op het scherm (Figuur 95). De gebruiker selecteert de kaart die hij wenst te gebruiken en klikt op Send. De gebruiker krijgt eerst nog eens de info te zien die verstuurd zal worden. Klikt hij daarna nogmaals op Send wordt het token effectief verstuurd. Figuur 94: Inlogscherm Figuur 95: Gebruiker selecteert card Als een gebruiker nog niet is geregistreerd op de website komt hij automatisch op de registreerpagina terecht. Hier ziet de gebruiker de waarden die van de kaart zijn gehaald. Als een relying party nog extra informatie wenst te weten te komen zonder dat die in een token voorkomen, kan dit op deze manier gebeuren. Hier willen we bvb. de geboorteplaats en voorkeurstaal van een gebruiker te weten komen. Want bij self-issued cards is het niet mogelijk zelf claims bij te creëren. Wanneer de gebruiker zijn gegevens heeft ingevuld en op de knop Registreer heeft geklikt, krijgt de gebruiker een bevestiging dat zijn registratie geslaagd is. 172

175 CardSpace Figuur 96: Gebruiker dient bijkomende informatie op te geven Figuur 97: Gebruiker krijgt melding dat zijn registratie geslaagd is Wanneer de gebruiker dan nogmaals inlogt met diezelfde card, krijgt hij een melding dat hij ingelogd is. Figuur 98: Gebruiker is ingelogd Oproepen van de identity selector De eerste stap is het oproepen van de identity selector. Dit is het venster waarmee de gebruiker een card selecteert om te gebruiken op deze website. We zullen de code bekijken van de HTML pagina waar de gebruiker op een button kan klikken om zich aan te melden via CardSpace. <html> <body> <form id="form1" method="post" action="login.aspx"> Inloggen met CardSpace: <button type="submit" background-image: url(infocard.jpg);"></button> <object type="application/x-informationcard" name="xmltoken"> <param name="tokentype" value="urn:oasis:names:tc:saml:1.0:assertion" /> <param name="issuer" value="http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"/> <param name="requiredclaims" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname 173

176 CardSpace </object> </form> </body> </html> Code Listing 48: Het oproepen van de identity selector in html <object type="application/xinformationcard" name="xmltoken"> param name="tokentype param name="issuer" param name="requiredclaims" Definieert een information card object. We definiëren dit zodat de browser de identity selector kan openen. Hiermee definiëren we welke type van security tokens we kunnen ontvangen. In dit voorbeeld zijn dit SAML 1.0 tokens. Het adres van de identity provider. In dit geval is het een vast gecodeerd adres omdat we self-issued cards gebruiken. De claims die in het security token moeten aanwezig zijn. Op deze manier bepalen we de policy van onze relying party. Deze pagina bevat ook een form component. Via de action tag geven we aan dat het security token moet doorgegeven worden aan login.aspx Verwerken van security token Op dit moment heeft de gebruiker een card geselecteerd en is er een security token naar onze website gestuurd. Dit gaan we nu verwerken in login.aspx. Eerst wordt de code besproken om de informatie uit het security token te halen. Daarna ga we iets dieper in op het security token zelf en de decryptie ervan Gegevens uit het token halen Laten we even de code van login.aspx bekijken. string xmltoken; xmltoken = Request.Params["xmlToken"]; if (xmltoken == null xmltoken.equals("")) ShowError("Token presented was null"); else Token token = new Token(xmlToken); string unieke_id = token.uniqueid; DbController db = new DbController(); DataSet test = db.getmemberbyid(unieke_id); 174

177 CardSpace if (test.tables[0].rows.count == 0) //gebruiker is nog niet geregisteerd Session["token"] = token; Session["login"] = false; Response.Redirect("register.aspx"); else //gebruiker is reeds geregistreerd Session["token"] = token; Session["user"] = unieke_id; Session["login"] = true; Response.Redirect("loggedin.aspx"); Code Listing 49: Gegevens uit het token halen Het eerste wat we doen is het token (als string) op halen. Deze string bevat het geëncrypteerde token. Hoe zo een dergelijk token eruitziet wordt in het volgende puntje besproken. Om het token op te halen gebruiken we Request omdat het token via een HTML-form werd doorgestuurd. Daarna maken we een object aan van de klasse Token. Bij constructie geven we het geëncrypteerd token mee. Zoals reeds eerder gezien heeft iedere card een uniek id. Dit kunnen we gebruiken om gebruikers mee te identificeren wanneer ze zich aanmelden. Via het Token-object dat we aangemaakt hebben, kunnen we eenvoudig de gegevens uit het token halen. Daarna gaan we in de database zoeken naar de gebruiker met dit id. Wanneer er geen gebruiker wordt teruggevonden, is dat id nog niet aanwezig in de database en is de gebruiker dus nog niet geregistreerd. Daarom slaan we het token object op in het Session-object en sturen we de gebruiker door naar de registratiepagina. Is de gebruiker wel aanwezig in de database, dan geven we login op de sessie de waarde true. Hierbij beschouwen we de gebruiker als ingelogd Het security token in detail Voor ontwikkelaars maakt het in feite niet veel uit hoe zo een security token er precies uit ziet. Toch lijkt het me interessant om dergelijk token even van dichter te bekijken. Wanneer we een token versturen ziet het er als volgt uit: <enc:encrypteddata Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:enc="http://www.w3.org/2001/04/xmlenc#"> <enc:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <e:encryptedkey xmlns:e="http://www.w3.org/2001/04/xmlenc#"> <e:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> </e:encryptionmethod> <KeyInfo> <o:securitytokenreference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis wsswssecurity-secext-1.0.xsd"> <o:keyidentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security- 1.1#ThumbprintSHA1" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis wss-soapmessage-security-1.0#Base64Binary">1H3mV/pJAlVZAst/Dt0rqbBd67g=</o:KeyIdentifier> 175

178 CardSpace </o:securitytokenreference> </KeyInfo> <e:cipherdata> <e:ciphervalue>hcqbccl...w9iea==</e:ciphervalue> </e:cipherdata> </e:encryptedkey> </KeyInfo> <enc:cipherdata> <enc:ciphervalue>mjygfl...c6mi4u1k=</enc:ciphervalue> </enc:cipherdata> </enc:encrypteddata> Code Listing 50: Inhoud van een security token Het root element <enc:encrypteddata> bevat die elementen die nodig zijn om het token te decrypteren. <enc:encrypteddata> <enc:encryptionmethod /> <KeyInfo/> </enc:cipherdata> </enc:encrypteddata> Het <enc:encryptionmethod/> element bepaalt met welke encryptie methode het token is geëncrypteerd. <enc:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> In dit geval wordt AES-256-cbc gebruikt. Dit is een symmetrische sleutel encryptiemethode. Hierbij gebruiken beide partijen dus dezelfde sleutel. Deze symmetrische sleutel is gegenereerd door CardSpace en wordt de Transient Key genoemd. Deze wordt in geëncrypteerde vorm opgeslagen in het <e:encryptedkey> element binnen het <KeyInfo/> element. De Transient Key word geëncrypteerd met de publieke sleutel van de relying party (deze wordt uit het certificaat gehaald). De methode waarmee dit gebeurt is terug te vinden in het <e:encryptionmethod> element. <e:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> </e:encryptionmethod> In dit geval wordt RSA-OAEP-MGF1P gebruikt voor de encryptie. Verder wordt SHA1 gebruikt als hashfunctie. De sleutel waarmee de encryptie gebeurt is terug te vinden in het volgende <KeyInfo/> element. <KeyInfo> <o:securitytokenreference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis wsswssecurity-secext-1.0.xsd"> <o:keyidentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security- 1.1#ThumbprintSHA1" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis wss-soap-messagesecurity-1.0#Base64Binary">1H3mV/pJAlVZAst/Dt0rqbBd67g=</o:KeyIdentifier> </o:securitytokenreference> </KeyInfo> Met het <o:keyidentifier/> element laat CardSpace de relying party weten welk certificaat hij gebruikt heeft voor de encryptie van de Transient Key. 176

179 CardSpace De relying party gebruikt dan zijn eigen private sleutel om de data tussen de <e:cipherdata> </e:cipherdata> elementen te decrypteren. <e:cipherdata> <e:ciphervalue>hcqbccl...w9iea==</e:ciphervalue> </e:cipherdata> Op die manier weet de relying party de symmetrische sleutel om het token zelf de decrypteren: <enc:cipherdata> <enc:ciphervalue>mjygfl...c6mi4u1k=</enc:ciphervalue> </enc:cipherdata> Nu kan de relying party alle gegevens bekijken die in het token aanwezig zijn Decryptie van het security token Opm: Ook dit stukje is eerder bedoeld voor mensen die willen weten hoe de decryptie van een security token gebeurt. Deze code is door Microsoft ontwikkeld en kan door iedere ontwikkelaar worden gebruikt of aangepast. Om informatie te halen uit het token, maken we in de code van onze website gebruik van het Token-object. Het zou ons te ver leiden om de gehele klasse te bekijken maar hier worden de belangrijkste fragmenten beschreven. De eerste methode die in de constructor wordt opgeroepen is de decrypttoken(string xmltoken)methode. Nu worden de belangrijkste fragmenten uit deze methode besproken. Om het XML token te verwerken maken we gebruik van een XMLReader. XmlReader reader = new XmlTextReader(new StringReader(xmlToken)) Code Listing 51: Aanmaken XmlReader Eerst moeten we het <EncryptionMethod> element terug vinden. Daarin lezen we de waarde van het <Algorithm> element. Op die manier weten we met welk algoritme het token is geëncrypteerd. if (!reader.readtodescendant(xmlencryptionstrings.encryptionmethod, XmlEncryptionStrings.Namespace)) throw new ArgumentException("Cannot find token EncryptedMethod."); encryptionalgorithm = reader.getattribute(xmlencryptionstrings.algorithm).gethashcode(); Code Listing 52: XmlReader gebruiken om het gebruikte algoritme in te lezen Daarna gaan we op een gelijkaardige manier bepalen met welk algoritme de Transient Key is geëncrypteerd, welk certificaat werd gebruikt om de transient key te encrypteren en welke hashfunctie werd gebruikt. Ook wordt de waarde van de geëncrypteerde sleutel en het geëncrypteerde token bepaald. Dan moet het token nog gedecrypteerd worden aan de hand van de verzamelde informatie. 177

180 CardSpace Deze code kan zowel AES als Triple DES encryptie aan. Volgende code bepaalt welk algoritme gebruikt moet worden. SymmetricAlgorithm alg = null; X509Certificate2 certificate = FindCertificate(thumbprint); foreach (int i in Aes) if (encryptionalgorithm == i) alg = new RijndaelManaged(); break; if (alg == null) foreach (int i in TripleDes) if (encryptionalgorithm == i) alg = new TripleDESCryptoServiceProvider(); break; if (null == alg) throw new ArgumentException("Could not determine Symmetric Algorithm"); Code Listing 53: Decryptie van het token voor meerdere algoritmes Om de transient key te verkrijgen, decrypteren we deze met onze private sleutel. Eerder hebben we bepaald met welk van onze (als relying party) certificaten deze werd geëncrypteerd. alg.key = certificate.privatekey as RSACryptoServiceProvider).Decrypt(symmetricKeyData, true); Code Listing 54: transient key decrypteren met private sleutel Nu we de transient key hebben, kunnen we het token decrypteren. Dit gebeurt via volgende code: int ivsize = alg.blocksize / 8; byte[] iv = new byte[ivsize]; Buffer.BlockCopy(securityTokenData, 0, iv, 0, iv.length); alg.padding = PaddingMode.ISO10126; alg.mode = CipherMode.CBC; ICryptoTransform decrtransform = alg.createdecryptor(alg.key, iv); byte[] plaintext = decrtransform.transformfinalblock(securitytokendata, iv.length, securitytokendata.length - iv.length); decrtransform.dispose(); return plaintext; Code Listing 55: Decryptie van het token Nu hebben we dus ons token gedecrypteerd. Nu moeten we nog deserializen (token omvormen naar object) en de authenticiteit controleren. Deserializen is hier heel eenvoudig door het gebruik van de WSSecurityTokenSerializer. Ook authenticiteit controleren is eenvoudig door het gebruik van de SamlSecurityTokenAuthenticator. Hieronder ziet u de volledige code van de constructor. 178

181 CardSpace public Token(String xmltoken) byte[] decrypteddata = decrypttoken(xmltoken); XmlReader reader = new XmlTextReader(new StreamReader(new MemoryStream(decryptedData), Encoding.UTF8)); m_token = (SamlSecurityToken)WSSecurityTokenSerializer.DefaultInstance.ReadToken(reader, null); SamlSecurityTokenAuthenticator authenticator = new SamlSecurityTokenAuthenticator(new List<SecurityTokenAuthenticator>(new SecurityTokenAuthenticator[]new RsaSecurityTokenAuthenticator(), new X509SecurityTokenAuthenticator() ), MaximumTokenSkew); if (authenticator.canvalidatetoken(m_token)) ReadOnlyCollection<IAuthorizationPolicy> policies =authenticator.validatetoken(m_token); m_authorizationcontext = AuthorizationContext.CreateDefaultAuthorizationContext(policies); FindIdentityClaims(); else throw new Exception("Unable to validate the token."); Code Listing 56: Constructor van de Token klasse Certificaat van de relying party Zoals te lezen is in het vorige stukje wordt de transient key door de gebruiker (CardSpace) geëncrypteerd met de publieke sleutel van het certificaat van de relying party (webserver in dit geval). Ook in de demoapplicatie moet de webserver dus een certificaat hebben. In dit voorbeeld gaan we een certificaat installeren dat geleverd wordt door Microsoft voor testdoeleinden. Dit certificaat werd geleverd aan We zullen er dus voor moeten zorgen dat onze webserver met deze naam kan worden aangesproken. Eerst even bekijken hoe we het certificaat kunnen installeren op de webserver. Hiervoor openen we Internet Information Services via het configuratiescherm. We gaan naar de eigenschappen van de Default Website. Daar selecteren we het tabblad Mapbeveiliging. Via de knop Servercertificaat opent een wizard waarmee we een certificaat kunnen selecteren.vooraleer we het kunnen selecteren moet het geïnstalleerd zijn op de computer. Dit zullen we dus eerst doen. 179

182 CardSpace Figuur 99: Tabblad Mapbeveiliging bij Default Web Site eigenschappe We openen een console (Uitvoeren > MMC) en klikken we op Bestand > Module toevoegen/verwijderen. In dit venster klikken we opnieuw op Toevoegen. Opnieuw opent zich een venster waar we voor Certificaten (computeraccount) kiezen. Dan ziet de console er zo uit: Figuur 100: Console - Certificaten We klikken met de rechtermuisknop op de Certificaten (onder Persoonlijk) > Alle taken > Importeren. Dan opent zich een wizard waarmee we het certificaatbestand kunnen selecteren. Na het voltooien van de wizard is het certificaat nu aanwezig en kunnen we het nu gebruiken binnen IIS. Terug nu naar IIS. Wanneer we nu de wizard openen via Servercertificaat, kunnen we het certificaat van fabrikam selecteren. Figuur 101: Wizard om certificaat te installeren op webserver 180

183 CardSpace Wanneer de wizard voltooid is, is er een certificaat aanwezig op onze webserver. Dit certificaat werd uitgereikt door ADatum. Daarom moet ook het certificaat van ADatum nog worden geïnstalleerd in de map Vertrouwde basiscertificeringsinstanties. Dit gebeurt op een gelijkaardige manier. Nu kan de webserver gebruik maken van dit certificaat. Dit kunnen we testen door via een browser te surfen naar het adres: https://localhost. Nu krijgen we een melding dat er een probleem is met het certificaat. Dit is logisch want onze webserver heeft een certificaat voor het adres niet voor het adres localhost. Figuur 102: Foutmelding in browser door ongeldig certificaat Om IIS aan te kunnen spreken met openen we het host bestand in de map C:\WINDOWS\system32\drivers\etc (op XP) en voegen we volgende regel toe: Nu kunnen we IIS aanspreken met Tijdens de ontwikkeling van de website zal deze meestal gestart worden vanuit Visual Studio. Standaard gebruikt deze het localhost adres wat dus opnieuw een fout zal opleveren. Dit kunnen we oplossen door naar de eigenschappen van het VS-project te gaan en bij Start Options, onder Server, het overeenkomstige fabrikam adres in te vullen. Figuur 103: Startadres van website wijzigen in Visual Studio 181

184 CardSpace 4.8. Problemen Fout bij verwerken security token Situering: wanneer de gebruiker een card selecteert, wordt er een token gecreëerd en doorgestuurd naar pagina om het token te verwerken. Hierbij wordt een foutmelding getoond. Figuur 104: Foutmelding bij het verwerken van het security token Probleem: deze fout wordt opgeworpen door.net wanneer de waarden die meegegeven worden vanuit een formulier, < > bevatten. Dit kan er op wijzen dat een gebruiker bvb. HTML code in tekstvak heeft ingevuld. Standaard staat deze controle aan. Oplossing: Daar we in ons formulier enkel een knop hebben om de gebruiker zijn gewenste card te laten selecteren, kunnen we deze controle hier afzetten. Dit doen we door in het web.config bestand, volgende regel toe te voegen: <pages ValidateRequest="false" /> Hierdoor staat de controle af, en kan onze pagina zonder problemen het token verwerken Besluit Op het eerste zicht heeft het project wel kans op slagen. De meeste gebruikers worden geconfronteerd met het probleem van tientallen gebruikersnaam/paswoord combinaties. Voor deze gebruikers biedt CardSpace wel een oplossing. Ook phishing wordt hierdoor een stuk moeilijker. Voor meer beveiligde login systemen zal het afhangen van banken en andere instellingen hoe zij omgaan met het identiteit metasysteem. Vele banken hebben nu hun eigen systeem opgezet. De vraag is nu maar of ze bereid zijn mee te werken aan het ganse identiteit metasysteem, waar CardSpace deel van uitmaakt. Men kan de gebruiker eventueel de keuze 182

185 laten tussen de twee systemen. Maar de vraag is ook, in welk systeem zal de gebruiker het meeste vertrouwen hebben, dat van de bank of dat van hun OS? Op dit moment is het enkel Microsoft die een identity selector heeft ontwikkeld: CardSpace. Het is wachten op andere grote ontwikkelaars. Zo zou het project meer slaagkansen hebben als Apple Mac en Linux een identity selector zouden krijgen. Het grote voordeel is hier dat het metasysteem bestaat uit open standaarden. Een volledig systeem kan dus opgezet worden zonder ook maar één stukje Microsoft software. Wel kon Microsoft de ontwikkelaar op een betere manier helpen. Op hun site zijn zogenaamde kits aanwezig om te leren werken met CardSpace. De meest eenvoudige kits werken zonder problemen. Maar de meer geavanceerde zijn slecht gedocumenteerd. Zo wordt verwezen naar bestanden/mappen die niet aanwezig zijn in de kit. Het gaat hier niet om onbelangrijke bestanden. Zo is er een verwijzing naar een installatie bestand van zo een kit, dat niet eens aanwezig is. Of er wordt gezegd dat de bron code in een bepaalde map aanwezig is terwijl die map gewoon ontbreekt. Andere kits bevatten compilatie fouten. Voor een groot bedrijf als Microsoft zou dit toch niet mogen. Men zou toch moeten proberen zoveel mogelijk webontwikkelaars te overtuigen om CardSpace in hun website te implementeren. Als er slechts een beperkt aantal websites gebruik van maakt, zal CardSpace op zich weinig gebruikt worden. Daarom vind ik het onbegrijpelijk dat Microsoft de ontwikkelaars niet op een betere manier helpt. 183

186 Dolmen Workflow Services Deel 2 Dolmen Workflow Services 184

187 Dolmen Workflow Services Omschrijving van het project Hoofdstuk 1 Omschrijving van het project In deel 1 van deze scriptie hebben we uitvoerig de mogelijkheden van het.net Framework 3.0 besproken. Maar een nieuwe technologie leer je pas echt kennen als je ze toepast bij het ontwikkelen van een project. Daarom besloten we een project te ontwikkelen waarin alle vier onderdelen van het.net Framework 3.0 verwerkt zijn. Onze begeleider bij Dolmen, Dhr. Danny Christiaens bezorgde ons enkele screenshots van een bestaande web-based applicatie van Dolmen. Wanneer een klant graag een werknemer van Dolmen wil inhuren voor een bepaalde periode, kan een account manager een nieuwe demand invoeren in deze applicatie. Een demand is dus een aanvraag om een werknemer in te huren. Andere account managers kunnen dan deze demands bekijken en er eventueel kandidaten aan toewijzen. Wanneer voor een demand de juiste mensen gevonden zijn, kan de demand goedgekeurd en afgesloten worden. Wanneer geen kandidaten gevonden worden kan deze demand geannuleerd worden. Deze applicatie leek ons interessant omdat we hier alle onderdelen van het.net Framework 3.0 in kunnen gebruiken. Een demand kan in verschillende statussen terecht komen. Dit kan voorgesteld worden in een workflow dus hiervoor kunnen we de Workflow Foundation voor gebruiken. Voor de communicatie tussen webserver, database en workflow kan de Communication Foundation gebruikt worden. Voor de grafische vormgeving kunnen we een beroep doen op de Presentation Foundation Uiteraard mogen enkel bevoegde personen toegang hebben tot deze applicatie en dus is er een login nodig. Hiervoor kunnen we CardSpace gebruiken Analyse Aangezien het om een heel kleine en bestaande applicatie gaat is een uitgebreide analyse niet nodig. Op basis van de screenshots en enkele gesprekken met Dhr. Danny Christiaens probeerden we een idee te schetsen van wat de vereisten allemaal zijn. Omdat de verschillende statussen waarin een demand kan terecht komen belangrijk zijn, stelden we hiervoor een statechart op. 185

188 Dolmen Workflow Services Omschrijving van het project Figuur 105: Statechart workflow 186

189 Dolmen Workflow Services Uitwerking Hoofdstuk 2 Uitwerking 2.1. Omgeving Bij de implementatie van het project hebben we gekozen om in een aantal lagen te werken. De onderste laag is de databaselaag, waar we Microsoft SQL Server 2005 gebruiken. Dat was een voor de hand liggende keuze aangezien de Workflow Foundation hier standaard mee werkt. Een volgende laag is die van de workflow. Hier bevindt zich alle logica die nodig is bij het verwerken van de aanvragen. Dit is ook meteen de enige laag waar met de database gecommuniceerd wordt. Om deze workflow naar andere applicaties open te stellen wordt een WCF service gebruikt. Op deze manier kunnen we de applicatie van verschillende interfaces voorzien zonder dat hier veel werk voor nodig is. Een volgende laag is de grafische user interface. In eerste instantie is hiervoor een ASP.NET website voor ontwikkeld. Deze maakte het mogelijk om snel het volledige systeem te testen. In een later stadium is de WPF interface ontwikkeld. Dit is een goed voorbeeld dat aantoont hoe eenvoudig het kan zijn om meerdere soorten interfaces voor een applicatie te hebben doordat er met services gewerkt wordt. Als laatste onderdeel is er Windows Cardspace dat gebruikt wordt om in te loggen op de applicatie op een gebruiksvriendelijke manier. Op deze manier worden alle onderdelen van het.net Framework 3.0 gebruikt binnen het project. Om het project te gebruiken is natuurlijk het.net Framework 3.0 nodig en een SQL Server Daarnaast moet voor de ASP.NET site een webserver zoals IIS. Om de WPF applicatie te kunnen draaien is ook een recente browser nodig, IE 6 of hoger. Figuur 106: Project omgeving 187

190 Dolmen Workflow Services Uitwerking 2.2. Databaselaag In de databaselaag zijn er twee databases om de nodige informatie bij te houden uit de applicatie. De eerste, de SqlPersistenceService database, is er als standaard implementatie van de PersistenceService van de Windows Workflow Foundation. De tabellen zijn dan ook door Microsoft ontworpen en werden met een script geinitialiseerd. In deze tabellen wordt alle informatie over de workflows bijgehouden. Figuur 107: SqlPersistenceService databaseschema De tweede database, de WorkflowServices database, is ontworpen in funtie van de applicatie en bevat de gegevens van werknemers, klanten, aanvragen en dergelijke. Deze database is ook gelinkt met de vorige door een workflowid in de Demandtabel. Vanuit de applicatie wordt enkel de WorkflowServices database expliciet aangesproken, alle informatie die in de SqlPersistenceService database terechtkomt wordt daar automatisch ingeplaatst door de Workflow Runtime en de Persistence Service. 188

191 Dolmen Workflow Services Uitwerking Figuur 108: WorkflowServicesdatabaseschema 189

192 Dolmen Workflow Services Uitwerking 2.3. Windows Workflow Foundation Alle logica die zorgt voor het maken van nieuwe aanvragen en de verwerking die hier bijhoort zit vervat in een workflow. Dit is een voorbeeld van een StateMachine workflow, aangezien de aanvraag zich in verschillende toestanden kan bevinden. Figuur 109: Workflow overzicht Op het overzicht van de workflow zien we de verschillende toestanden waarin een aanvraag zich kan bevinden en de verschillende gebeurtenissen die zich kunnen voordoen in die toestanden. Deze gebeurtenissen kunnen ervoor zorgen dat de workflow overgaat naar een nieuwe toestand maar dit hoeft niet altijd het geval te zijn. 190

193 Dolmen Workflow Services Uitwerking Figuur 110: Detail van de verwerking van een update van een aanvraag In dit detail van de update gebeurtenis op een aanvraag zien we dat er eerst gewacht wordt op het update event. Vervolgens wordt de database aangepast en wordt de workflow opnieuw in een open toestand gebracht. De code die achter de workflow zit is enkel een doorgeefluik naar de databaselaag. public sealed partial class WSWorkflow: StateMachineWorkflowActivity private DataLayer.DbController db = new DataLayer.DbController(); public object DemandSender = new System.Object(); public WSService.DemandEventArgs DemandEvtArgs = default(wsservice.demandeventargs); public WSService.CandidateEventArgs CandidateEvtArgs = default(wsservice.candidateeventargs); public WSWorkflow() InitializeComponent(); private void insertintodb_executecode(object sender, EventArgs e) db.insertdemand(demandevtargs); 191

194 Dolmen Workflow Services Uitwerking private void updatedb_executecode(object sender, EventArgs e) private void insertcandidateintodb_executecode(object sender, EventArgs e) db.insertcandidate(candidateevtargs); private void updatecandb_executecode(object sender, EventArgs e) private void removecanfromdb_executecode(object sender, EventArgs e) private void updatedbcancel_executecode(object sender, EventArgs e) Code Listing 57: WSWorkflow klasse, code die achter de workflow zit De gebeurtenissen die deze workflow sturen komen van buiten de workflow, namelijk vanuit de WCF service die de functionaliteit naar buiten beschikbaar stelt en dus onrechtstreeks vanuit de grafische interface waarmee de gebruiker werkt. Het was dan ook nodig om deze gebeurtenissen zelf te implementeren, samen met de argumenten die deze gebeurtenissen nodig hebben. De klassen DemandEventArgs en CandidateEventArgs zijn dan ook de argumentklassen die gebruikt worden bij de events die respectievelijk op aanvragen en kandidaten van toepassing zijn. [Serializable] public class CandidateEventArgs : ExternalDataEventArgs private int candidateid; private int demand; private int employee; private int partner; private bool presented; private bool approved; private DateTime dateavailable; private bool status; private string comments; private string feedback; public string Feedback get return feedback; set feedback = value; public int CandidateId get return candidateid; set candidateid = value; 192

195 Dolmen Workflow Services Uitwerking public CandidateEventArgs(CandidateInfo c,guid g) : base(g) candidateid = c.candidateid; demand = c.demand; employee = c.employee; partner = c.partner; presented = c.presented; approved = c.approved; dateavailable = c.dateavailable; status = c.status; comments = c.comments; feedback = c.feedback; Code Listing 58: CandidateEventArgs klasse In de IDemandService interface worden deze events gedeclareerd. [ExternalDataExchange] public interface IDemandService event EventHandler<DemandEventArgs> DemandCreated; event EventHandler<DemandEventArgs> DemandUpdated; event EventHandler<DemandEventArgs> DemandApproved; event EventHandler<DemandEventArgs> DemandCancelled; event EventHandler<CandidateEventArgs> CandidateAdded; event EventHandler<CandidateEventArgs> CandidateUpdated; event EventHandler<CandidateEventArgs> CandidateRemoved; Code Listing 59: IDemandService interface De DemandService klasse is dan weer de implementatie van de IDemandService interface van waaruit de nodige events kunnen opgeroepen worden. public class DemandService : IDemandService public DemandService() public void RaiseDemandCreatedEvent(DemandInfo d) if (DemandCreated!= null) Guid g = new Guid(d.workflowId); DemandCreated(null, new DemandEventArgs(d, g)); public void RaiseDemandUpdatedEvent(DemandInfo d) public void RaiseDemandApprovedEvent(DemandInfo d) public void RaiseDemandCancelledEvent(DemandInfo d) 193

196 Dolmen Workflow Services Uitwerking public void RaiseCandidateAddedEvent(CandidateInfo c) if (CandidateAdded!= null) DataLayer.DbController db = new DataLayer.DbController(); Guid g = new Guid(db.getGuid(c.Demand + "")); CandidateAdded(null,new CandidateEventArgs(c,g)); public void RaiseCandidateUpdatedEvent(CandidateInfo c) public void RaiseCandidateRemovedEvent(CandidateInfo c) #region IDemandService Members public event EventHandler<DemandEventArgs> DemandCreated; public event EventHandler<DemandEventArgs> DemandUpdated; public event EventHandler<DemandEventArgs> DemandApproved; public event EventHandler<DemandEventArgs> DemandCancelled; public event EventHandler<CandidateEventArgs> CandidateAdded; public event EventHandler<CandidateEventArgs> CandidateUpdated; public event EventHandler<CandidateEventArgs> CandidateRemoved; #endregion Code Listing 60: DemancService klasse, implementatie van de IDemandService interface Al deze achterliggende systemen worden gebruikt vanuit de klasse WorkflowRuntimeController die ervoor zorgt dat de workflow gebruikt kan worden door andere programma s zoals de WCF Service die later aan bod komt. class WorkflowRuntimeController WorkflowRuntime workflowruntime; ManualWorkflowSchedulerService scheduler; DataLayer.DbController db = new DataLayer.DbController(); //Connectiestring naar de SQLPersistenceService database string connstring = "Initial Catalog=SQLPersistenceService;Data Source=.;Integrated Security=SSPI;"; public void StartApplication() workflowruntime = new WorkflowRuntime(); //Toevoegen van een ManualWorkflowSchedulerService //Hierdoor kunnen we zelf de workflows controleren scheduler = new ManualWorkflowSchedulerService(); workflowruntime.addservice(scheduler); //Toevoegen van een ExternalDataExchangeService aan de workflow runtime //Dit maakt het mogelijk om te communiceren met de workflow ExternalDataExchangeService extdataexchservice = new ExternalDataExchangeService(); workflowruntime.addservice(extdataexchservice); //Opzetten van de Persistence Service System.Collections.Specialized.NameValueCollection nvc = new System.Collections.Specialized.NameValueCollection(); nvc.add("connectionstring", connstring); nvc.add("unloadonidle", bool.truestring); 194

197 Dolmen Workflow Services Uitwerking nvc.add("loadintervalseconds", "2"); SqlWorkflowPersistenceService sqlwps = new SqlWorkflowPersistenceService(nVC); workflowruntime.addservice(sqlwps); //Opstarten van de workflow runtime workflowruntime.startruntime(); //Toevoegen van de demandservice aan de de workflow runtime WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); if (demandservice == null) demandservice = new WSService.DemandService(); extdataexchservice.addservice(demandservice); //Luisteren naar het beeindigen van de workflow workflowruntime.workflowcompleted += new EventHandler<WorkflowCompletedEventArgs> (workflowruntime_workflowcompleted); public void StopApplication() workflowruntime.stopruntime(); private Guid StartNewWorkflowInstance() WorkflowInstance workflowinstance = workflowruntime.createworkflow(typeof(workflowservices.wsworkflow)); workflowinstance.start(); scheduler.runworkflow(workflowinstance.instanceid); return workflowinstance.instanceid; private string GetCurrentState(Guid instanceid) StateMachineWorkflowInstance stateinstance = new StateMachineWorkflowInstance(workflowRuntime, instanceid); return stateinstance.currentstatename; void workflowruntime_workflowcompleted(object sender, WorkflowCompletedEventArgs e) public Guid createworkflow(demandinfo d) Guid instanceid = StartNewWorkflowInstance(); d.workflowid = instanceid.tostring(); WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); demandservice.raisedemandcreatedevent(d); scheduler.runworkflow(instanceid); return instanceid; 195

198 Dolmen Workflow Services Uitwerking public void updateworkflow(demandinfo d) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); demandservice.raisedemandupdatedevent(d); Guid g = new Guid(d.workflowId); scheduler.runworkflow(g); public void addcandidate(candidateinfo c) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); demandservice.raisecandidateaddedevent(c); Guid g = new Guid(db.getGuid(c.Demand + "")); scheduler.runworkflow(g); public void updatecandidate(candidateinfo c) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); demandservice.raisecandidateupdatedevent(c); Guid g = new Guid(db.getGuid(c.Demand + "")); scheduler.runworkflow(g); public void removecandidate(candidateinfo c) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); demandservice.raisecandidateremovedevent(c); Guid g = new Guid(db.getGuid(c.Demand + "")); scheduler.runworkflow(g); public void approveworkflow(guid guid) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); DemandInfo d = new DemandInfo(); d.workflowid = guid.tostring(); d.demandid = db.getdemandid(guid.tostring()); demandservice.raisedemandapprovedevent(d); scheduler.runworkflow(guid); public void cancelworkflow(guid guid) WSService.DemandService demandservice = workflowruntime.getservice<wsservice.demandservice>(); DemandInfo d = new DemandInfo(); d.workflowid = guid.tostring(); d.demandid = db.getdemandid(guid.tostring()); demandservice.raisedemandcancelledevent(d); scheduler.runworkflow(guid); Code Listing 61: WorkflowRuntimeController klasse 196

199 Dolmen Workflow Services Uitwerking 2.4. Windows Communication Foundation Voor ons proefproject hebben we een Windows Communication Foundation Service gecreëerd. Alle communicatie tussen de browserapplicatie en de webserver gebeurt via deze service. Zoals in Figuur 106 te zien is, biedt deze WCF-service toegang tot de workflow logica en de database. Zoals reeds in hoofdstuk 2 (Deel 1) te lezen is, bestaat een WCF-service uit drie componenten: een service klasse, een of meerdere endpoints en een hostomgeving. We zullen hier kort bespreken hoe deze eruitzien in ons proefproject Service klasse In deze klasse gaan we bepalen welke methodes de service aanbiedt aan zijn gebruikers. In ons project hebben we hiervoor gebruik gemaakt van een interface. In de interface IWSWCFService staan de methodes die een client kan gebruiken (indien de methode is vergezeld van een OperationContract tag). [ServiceContract] public interface IWSWCFService [OperationContract] DataSet getcandidatesbydemandid(int demandid); [OperationContract] void ApproveDemand(DemandInfo d);... [OperationContract] CandidateInfo getcandidate(int candidateid); Code Listing 62: ServiceContract van de WCF-service Zoals te zien is in Code Listing 62 zijn er methodes die zelfgecreëerde klassen gebruiken. Omdat het transport door de service goed zou verlopen, worden deze klassen voorzien van een DataContract tag en hun elementen met een DataMember tag (enkel elementen met DataMember zullen verstuurd worden door de service). [DataContract] public class CandidateInfo [DataMember] public int CandidateId;... [DataMember] public string Feedback; Code Listing 63: DataContract bij de klasse CandidateInfo Deze interface moet natuurlijk nog worden geïmplementeerd. De implementatie hiervan is te zien in Code Listing 64. Hierbij zie je dat de service zowel toegang biedt tot de workflow-logica als de database. 197

200 Dolmen Workflow Services Uitwerking public class WSWCFService : IWSWCFService DataLayer.DbController db = new DataLayer.DbController(); public string CreateDemand(DemandInfo d) WorkflowRuntimeController wrc = Program.Wrc; return wrc.createworkflow(d).tostring();... public void UpdateOnlineMember(string id, bool approved) db.updateonlinemember(id, approved); Code Listing 64: Implementatie van de IWSWCFService interface Endpoints Wanneer een client verbinding wenst te maken met een WCF-service zal hij die doen via een endpoint. Daar onze demoapplicatie kleinschalig is met maar één type verbruiker (nl. de webapplicatie) heeft de service slechts één endpoint voor de service zelf. Er is een bijkomend endpoint voor metadata. Er zijn meerdere mogelijkheden om endpoints te definiëren (zie hoofdstuk 2 (Deel 1)). Hier hebben we ervoor gekozen deze te definieren in het configuratie bestand van het service-project. We hebben een endpoint met adres EndPoint1. Het gaat hier om een relatief adres omdat de service op zich een absoluut adres heeft. Omdat dit endpoint geen speciale vereisten heeft qua security en dergelijke, hebben we gekozen voor een basichttpbinding binding. Het andere endpoint wordt gebruikt om metadata over de service te verkrijgen. Het volstaat een endpoint te creëren met als contract IMetadataExchance (standaard aanwezig), met als binding mexhttpbinding en als adres mex. In de service tag is er ook gebruik gemaakt van metadatabehavior. Deze behavior is binnen de behaviors tags gedefinieerd. Als het adres van de service wordt ingeven in een browser krijgt de gebruiker dankzij deze binding meer informatie (metadata) over de service. Wanneer er een fout optreedt krijgt de gebruiker ook een gepaste foutmelding op het scherm dankzij deze behavior. <?xml version="1.0" encoding="utf-8"?> <configuration> <system.servicemodel> <services> <service name="workflowservices.wswcfservice" behaviorconfiguration=" metadatabehavior"> <endpoint contract="workflowservices.iwswcfservice" binding="basichttpbinding" address="endpoint1"/> <endpoint contract="imetadataexchange" binding="mexhttpbinding" address="mex" /> </service> </services> <behaviors> <servicebehaviors> <behavior name=" metadatabehavior" > <servicemetadata httpgetenabled="true"/> <servicedebug includeexceptiondetailinfaults="true" /> </behavior> </servicebehaviors> </behaviors> </system.servicemodel> </configuration> Code Listing 65: Configuratie bestand van de service 198

201 Dolmen Workflow Services Uitwerking Host omgeving Gedurende de ontwikkeling van de applicatie werd de service gehost in een arbitrair proces. Dit is vooral handig omdat de service tijdens de ontwikkeling voortdurend wijzigt en je op die manier geen werk hebt om de service opnieuw beschikbaar te maken. Wanneer je deze zou hosten binnen Windows Services zou je de service telkens opnieuw moeten installeren. Een bijkomend voordeel van hosten in een arbitrair proces is dat je op die manier makkelijk kan debuggen wat natuurlijk handig is tijdens de ontwikkelingsfase. Eenmaal volledig ontwikkeld en uitvoerig getest, wordt de service gehost binnen Windows Services. Hierdoor kan eenvoudig aan logging gedaan worden en kan een administrator eenvoudig dergelijke services beheren. Hoe beide manieren van hosten precies in hun werk gaan werd reeds besproken in Host omgeving van een WCF service dus dat gaan we hier niet meer doen Windows Presentation Foundation Bij de WPF interface hebben we voor een XBAP gekozen omdat deze naast de vernieuwende grafische mogelijkheden ook het voordeel heeft dat deze binnen een browser wordt uitgevoerd en dus geen installatieprocedure nodig heeft. We hebben er dan ook voor geopteerd om een navigatiegebaseerde applicatie te maken, waarbij de gebruiker tussen verschillende vensters schakelt om de nodige informatie te zien te krijgen en te gebruiken. Daarnaast hebben we ook zoveel mogelijk gebruik gemaakt van de nieuwe mogelijkheden waaronder dus ook animaties en dergelijke. In de screenshots zijn deze echter spijtig genoeg niet te zien. Figuur 111: Header met Gradient achtergrond Figuur 112: Header met Image achtergrond 199

202 Dolmen Workflow Services Uitwerking Vooreerst zijn er een aantal onderdelen van de lay-out die op elke pagina voorkomen. Op elke pagina is bijvoorbeeld de header te zien zoals hierboven. Hier heeft de gebruiker de mogelijkheid om te kiezen tussen twee achtergronden, een donkere die opgebouwd is uit een LinearGradientBrush of een kleurige achtergrond die een afbeelding is. Deze instelling blijft vervolgens doorheen de aplicatie behouden. Dit is voorbeeld van een databinding die vanuit code vastgelegd wordt. Hiervoor wordt de methode loadbackground() aangeroepen bij het aanmaken van de pagina. <Border Grid.Row="0" Style="DynamicResource GlassBorder"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"></ColumnDefinition> <ColumnDefinition Width="auto"></ColumnDefinition> <ColumnDefinition Width="auto"></ColumnDefinition> <ColumnDefinition Width="auto"></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> </Grid.RowDefinitions> <Image Grid.Column="0" Source="LogoDolmen.gif" Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Right" Margin="5,5,15,5"> <Image.BitmapEffect> <OuterGlowBitmapEffect GlowSize="8.0" GlowColor="SteelBlue" Opacity="1.0"/> </Image.BitmapEffect> </Image> <Label Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="3" Style="DynamicResource LabelStyle" Content="Workflow Services" FontSize="36"> <Label.BitmapEffect> <OuterGlowBitmapEffect GlowSize="8.0" GlowColor="SteelBlue" Opacity="1.0"/> </Label.BitmapEffect> </Label> <Label Grid.Column="1" Grid.Row="2" Style="DynamicResource LabelStyle">Background:</Label> <ComboBox Grid.Column="2" Grid.Row="2" Name="BackgroundList" DisplayMemberPath="Name" SelectedValuePath="Value"></ComboBox> <Button Click="AdminClick" Foreground="White" Template="DynamicResource GlassButton" Grid.Column="3" Grid.Row="1" Grid.RowSpan="2">Admin</Button> </Grid> </Border> public void loadbackground() t = (App)App.Current; Code Listing 66: XAML code voor de header //Opvullen lijst BackgroundList.ItemsSource = t.backgroundoptions; if (t.backgroundbrush == null) //Bij het opstarten van de applicatie BackgroundList.SelectedValue = (Brush)FindResource("ImageBackground"); t.backgroundbrush = (Brush)BackgroundList.SelectedValue; 200

203 Dolmen Workflow Services Uitwerking else BackgroundList.SelectedValue = t.backgroundbrush; //Binding van de Background property van de pagina Binding bi = new Binding(); bi.source = BackgroundList; bi.path = new PropertyPath("SelectedValue"); this.setbinding(page.backgroundproperty, bi); BackgroundList.SelectionChanged += new SelectionChangedEventHandler(BackgroundList_SelectionChanged); void BackgroundList_SelectionChanged(object sender, SelectionChangedEventArgs e) //Opslaan van de wijziging op applicatieniveau t.backgroundbrush = (Brush)BackgroundList.SelectedValue; Code Listing 67: C# code voor de Binding van de Background property Een andere gemeenschappelijke eigenschap is dat er bij de navigatie van de ene pagina naar de andere een fade effect gebruikt wordt waardoor de ene pagina geleidelijk aan verdwijnt en de volgende pagina op dezelfde manier verschijnt. Het fade-in effect is hierbij volledig in XAML gecordeerd terwijl het fade-out effect van een pagina volledig in de achterliggende code wordt beschreven. <Page.Resources> <Storyboard x:key="onloaded1"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="grid" Storyboard.TargetProperty="(UIElement.Opacity)"> <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> <SplineDoubleKeyFrame KeyTime="00:00:0.5" Value="1"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </Page.Resources> <Page.Triggers> <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="StaticResource OnLoaded1"/> </EventTrigger> </Page.Triggers> Code Listing 68: XAML code voor het fade-in effect Page nextpage; //Verwerkt het klikken op de Admin knop public void AdminClick(object sender, RoutedEventArgs e) nextpage = new Admin(); startfadeoutanimation(); //Laat de pagina uitfaden en roept daarna de da_completed methode op public void startfadeoutanimation() DoubleAnimation da = new DoubleAnimation(); da.to = 0; da.duration = new Duration(TimeSpan.Parse("0:0:0.5")); da.completed += new EventHandler(da_Completed); grid.beginanimation(grid.opacityproperty, da); //Wordt aangeroepen na het beeindigen van de fade-out en zorgt voor de navigatie void da_completed(object sender, EventArgs e) 201

204 Dolmen Workflow Services Uitwerking this.navigationservice.navigate(nextpage); Code Listing 69: C# code voor het fade-out effect Daarnaast worden alle tekstvelden en labels op dezelfde manier weergegeven doordat ze van een stijl gebruik maken. Deze stijl aanpassen is dus genoeg om het uitzicht van bijvoorbeeld alle tekstvelden te wijzigen. <Style x:key="textboxstyle" BasedOn="x:Null" TargetType="x:Type TextBox"> <Setter Property="MinWidth" Value="150"/> <Setter Property="Foreground" Value="DynamicResource x:static SystemColors.ControlTextBrushKey"/> <Setter Property="BorderBrush" Value="StaticResource TextBoxBorder"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="1"/> <Setter Property="AllowDrop" Value="true"/> <Setter Property="FocusVisualStyle" Value="x:Null"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="x:Type TextBox"> <Microsoft_Windows_Themes:ListBoxChrome SnapsToDevicePixels="true" x:name="bd" Background="TemplateBinding Background" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" RenderFocused="TemplateBinding IsKeyboardFocusWithin" RenderMouseOver="TemplateBinding IsMouseOver"> <ScrollViewer SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" x:name="part_contenthost" BorderBrush="#FF727272" BorderThickness="1,1,1,1" Panel.ZIndex="0"> <ScrollViewer.Background> <LinearGradientBrush EndPoint="0.493,1.013" StartPoint="0.493,-0.057"> <GradientStop Color="#7F8A8585" Offset="0.558"/> <GradientStop Color="#7F7A7A7A" Offset="1"/> <GradientStop Color="#7FBFBBBB" Offset="0.442"/> <GradientStop Color="#7FD2D2D2" Offset="0"/> </LinearGradientBrush> </ScrollViewer.Background> </ScrollViewer> </Microsoft_Windows_Themes:ListBoxChrome> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Background" TargetName="Bd" Value="DynamicResource x:static SystemColors.ControlBrushKey"/> <Setter Property="Foreground" Value="DynamicResource x:static SystemColors.GrayTextBrushKey"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> Code Listing 70: XAML code voor de Textbox stijl Ook is er een controltemplate, de GlassButton template, ontwikkeld om de knoppen een aantrekkelijk uiterlijk te geven. Hiermee hebben we een knop ontwikkeld die gedeeltelijk doorzicht is en daardoor de kleur van de omgeving aanneemt. Daardoor is deze gemakkelijk overal inzetbaar. Dit is te zien op de screenshots van de header met een verschillende achtergrond. Er is ook een animatie toegepast wanneer de gebruiker met de muis binnen de knop gaat. 202

205 Dolmen Workflow Services Uitwerking <ControlTemplate x:key="glassbutton" TargetType="x:Type Button"> <ControlTemplate.Resources> <Storyboard x:key="timeline1"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Glow" Storyboard.TargetProperty="(UIElement.Opacity)"> <SplineDoubleKeyFrame KeyTime="00:00: " Value="1"/> </DoubleAnimationUsingKeyFrames> </Storyboard> <Storyboard x:key="timeline2"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Glow" Storyboard.TargetProperty="(UIElement.Opacity)"> <SplineDoubleKeyFrame KeyTime="00:00: " Value="0"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </ControlTemplate.Resources> <Border Margin="5,5,5,5"> <Border x:name="border" Background="# " BorderBrush="#FF000000" BorderThickness="1,1,1,1" CornerRadius="4,4,4,4"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="0.506*"/> <RowDefinition Height="0.494*"/> </Grid.RowDefinitions> <Border Opacity="0" x:name="glow" Grid.RowSpan="2" CornerRadius="4,4,4,4"> <Border.Background> <RadialGradientBrush> <RadialGradientBrush.RelativeTransform> <TransformGroup> <ScaleTransform ScaleX="1.432" ScaleY="2.028"/> <SkewTransform AngleX="0" AngleY="0"/> <RotateTransform Angle="0"/> <TranslateTransform X="-0.216" Y="0"/> </TransformGroup> </RadialGradientBrush.RelativeTransform> <GradientStop Color="#B23270EC" Offset="0"/> <GradientStop Color="#003270EC" Offset="1"/> </RadialGradientBrush> </Border.Background> </Border> <ContentPresenter Margin="5,5,5,5" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.RowSpan="2" OpacityMask="#FF000000"/> <Border Margin="0,0,0,0" x:name="shine" CornerRadius="4,4,0,0"> <Border.Background> <LinearGradientBrush EndPoint="0.5,1.056" StartPoint="0.5,-0.022"> <GradientStop Color="#99FFFFFF" Offset="0"/> <GradientStop Color="#33FFFFFF" Offset="1"/> </LinearGradientBrush> </Border.Background> </Border> </Grid> </Border> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Trigger.EnterActions> <BeginStoryboard x:name="timeline1_beginstoryboard2" Storyboard="StaticResource Timeline1"/> </Trigger.EnterActions> <Trigger.ExitActions> <BeginStoryboard x:name="timeline1_beginstoryboard" Storyboard="StaticResource Timeline2"/> </Trigger.ExitActions> </Trigger> 203

206 Dolmen Workflow Services Uitwerking <Trigger Property="IsPressed" Value="True"> <Setter Property="Visibility" TargetName="Glow" Value="Hidden"/> <Setter Property="Opacity" TargetName="Shine" Value="0.4"/> <Setter Property="Background" TargetName="border" Value="#CC000000"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> Code Listing 71: XAML code voor de GlassButton template Er is ook een border gemaakt, de GlassBorder, die de donkere achtergrond is van elk onderdeel van een pagina. Deze is opnieuw gedeeltelijk doorzichtig dus deze past zich ook aan aan het uitzicht van de applicatie. Alle stijlen en templates voor het uitzicht van de applicatie worden zoveel mogelijk gedefinieerd in het App.xaml bestand, op deze manier is het eenvoudig om deze te hergebruiken over de verschillende pagina s DemandsPage.xaml Figuur 113: DemandsPage.xaml Deze pagina is de openingspagina van de applicatie en geeft alle aanvragen weer die momenteel verwerkt worden. Deze worden weergegeven in een ListView die als databron een DataSet gebruikt. Binnen deze ListView gebruiken we een GridView om de informatie in kolommen weer te geven. In deze GridView zijn daarom een aantal kolommen gedefinieerd die zorgen voor de databinding en een aantal kolommen die knoppen voorzien zodat er interactie mogelijk is. 204

207 Dolmen Workflow Services Uitwerking <ListView x:name="demandslistview" IsSynchronizedWithCurrentItem="False" ItemsSource="Binding Path=Table" Background="#FFDCDCDC" > <ListView.View> <GridView ColumnHeaderContainerStyle="DynamicResource GridViewColumnHeaderStyle1"> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Button Click="EditButtonClick" CommandParameter="Binding Path=WorkflowId" Content="Edit" Foreground="White" Template="DynamicResource GlassButton" Style="DynamicResource WhiteText"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Button Click="ApproveButtonClick" CommandParameter="Binding Path=WorkflowId" Content="Approve" Foreground="White" Template="DynamicResource GlassButton" Style="DynamicResource WhiteText"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Button Click="CancelButtonClick" CommandParameter="Binding Path=WorkflowId" Content="Cancel" Foreground="White" Template="DynamicResource GlassButton" Style="DynamicResource WhiteText"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="DemandId" DisplayMemberBinding="Binding Path=DemandId"/> <GridViewColumn Header="WorkflowId" DisplayMemberBinding="Binding Path=WorkflowId"/> <GridViewColumn Header="Customer" DisplayMemberBinding="Binding Path=CustomerName"/> <GridViewColumn Header ="Account mgr"> <GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <ContentPresenter Margin="0,0,5,0" Content="Binding Path=FirstName"></ContentPresenter> <ContentPresenter Content="Binding Path=LastName"></ContentPresenter> </StackPanel> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Function" DisplayMemberBinding="Binding Path=FunctionCandidate"/> <GridViewColumn Header="Description" DisplayMemberBinding="Binding Path=Description"/> <GridViewColumn Header="#E" DisplayMemberBinding="Binding Path=NrOfEmployees"/> </GridView> </ListView.View> </ListView> Code Listing 72: XAML code voor het overzicht van de aanvragen De header van de GridView op deze pagina is net zoals de knoppen doorheen de applicatie voorzien van een template om het uitzicht aan te passen. Deze template zorgt onder andere voor een kleine animatie bij het binnengaan van één van de headers. 205

208 Dolmen Workflow Services Uitwerking Op deze pagina zien we ook het effect van de GlassButton template. De knoppen binnen de GridView en deze erboven maken gebruik van dezelfde template maar door de andere achtergrond zien deze knoppen er ook anders uit. De Approve en Cancel knoppen in de GridView hebben rechtstreeks invloed op de workflow, de Edit knop zal de gebruiker doorsturen naar een volgende pagina, de DemandInfoPage.xaml pagina, om de details van de aanvraag te zien en aan te passen. Ook door de knop New Demand zal de gebruiker op deze detailpagina terechtkomen maar dan met de bedoeling om een nieuwe aanvraag te starten. Zoals gezegd gebeurt dit navigeren met een fade animatie DemandInfoPage.xaml Figuur 114: DemandInfoPage.xaml Op deze pagina ziet de gebruiker de details van de aanvraag die hij in het vorige scherm heeft geselecteerd en kan deze ook wijzigen. Op deze pagina zijn twee DataTemplates gedefinieerd om een werknemer en een klant op een bepaalde manier weer te geven in de selectielijsten. 206

209 Dolmen Workflow Services Uitwerking <DataTemplate x:key="customertemplate"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal"> <Label Content="Binding Path=Name"></Label> </StackPanel> <StackPanel Grid.Row="1" Orientation="Horizontal"> <Label Content="Binding Path=Street"></Label> <Label Content="Binding Path=Nr"></Label> </StackPanel> <StackPanel Grid.Row="2" Orientation="Horizontal"> <Label Content="Binding Path=PostalCode"></Label> <Label Content="Binding Path=City"></Label> <Label Content="Binding Path=Country"></Label> </StackPanel> </Grid> </DataTemplate> Code Listing 73: XAML code voor het DataTemplate voor een klant Daarnaast zijn alle onderdelen eenvoudig te verbergen waardoor ook goed te zien is hoe de lay-out zichzelf aanpast aan de nodige ruimte. Alle velden op deze pagina worden opgevuld door databinding. Bij het aanmaken van de pagina wordt een DemandInfo object als DataContext ingesteld voor de Grid waar alle velden zich in bevinden. In dit object zit alle informatie over de aanvraag. Bij alle velden wordt dan de binding toegepast op het juiste attribuut van dit object. Van zodra de gebruiker iets wijzigt in het tekstveld is deze wijziging meteen te zien in het achterliggende object. Bij het verlaten van de pagina moet dus enkel het object opgeslagen worden zonder dat alle informatie expliciet uit de controls moet gehaald worden. Indien de gebruiker op de vorige pagina kiest voor een nieuwe aanvraag wordt op deze pagina een nieuw en dus leeg object aangemaakt en wordt dit gebruikt voor de databinding. De velden zijn dus leeg en de gebruiker kan starten met het invoeren van de gegevens. WSWCFServiceClient service; DemandInfo di; public void loadpage() di = service.getdemand(wfid); InfoGrid.DataContext = di; DataSet empl = service.getemployees(); AuthorComboBox.ItemsSource = empl.tables[0].defaultview; AccountMgrComboBox.ItemsSource = empl.tables[0].defaultview; CustomerComboBox.ItemsSource = service.getcustomers().tables[0].defaultview; TypeComboBox.ItemsSource = service.gettypes().tables[0].defaultview; Code Listing 74: C# code voor de databinding <ComboBox Grid.Column="1" Grid.Row="0" Name="AuthorComboBox" SelectedValuePath="EmployeeId" ItemTemplate="StaticResource EmployeeTemplate" SelectedValue="Binding author"/> <TextBox Grid.Column="1" Grid.Row="2" Text="Binding function" Style="DynamicResource TextBoxStyleBig" Height="Auto"/> 207

210 Dolmen Workflow Services Uitwerking <ListBox Grid.Column="1" Grid.Row="5" Style="DynamicResource ListBoxStyle"> <ListBoxItem> <CheckBox IsChecked="Binding dutch">dutch</checkbox> </ListBoxItem> <ListBoxItem> <CheckBox IsChecked="Binding english">english</checkbox> </ListBoxItem> <ListBoxItem> <CheckBox IsChecked="Binding french">french</checkbox> </ListBoxItem> <ListBoxItem> <CheckBox IsChecked="Binding other">other</checkbox> </ListBoxItem> </ListBox> <dc:datepicker Grid.Column="1" Grid.Row="0" Value="Binding demanddate" Style="DynamicResource DatePickerStyle"/> Code Listing 75: XAML code voor de data binding op een aantal controls Onderaan kan de gebruiker ervoor kiezen om verder te gaan naar het scherm met de kandidaten voor deze aanvraag. Hij kan er ook voor kiezen om de wijzigingen op te slaan en om terug te keren naar het overzicht van de aanvragen. 208

211 Dolmen Workflow Services Uitwerking Candidates.xaml Figuur 115: Candidates.xaml Op deze pagina kan de gebruiker de kandidaten bekijken en wijzigen die reeds aan een demand zijn toegewezen. Via de knop AddCandidate kan hij er ook nieuwe aan toevoegen. In een lijst ziet de gebruiker de reeds toegewezen candidaten. Bovenaan de lijst staan radiobuttons waarmee hij: De kandidaten in de lijst kan filteren: hij kan enkel de reeds goedgekeurde tonen of enkel de kandidaten die wachten op een goedkeuring of beide. De kandidaten kan sorteren volgens familienaam, voornaam of datum van beschikbaarheid. De kandidaten kan groeperen per functie 209

212 Dolmen Workflow Services Uitwerking Voor dit scherm werd de informatie over de kandidaten opgeslagen in een CollectionViewSource en wordt de lijst hieraan gekoppeld (via een binding). Wanneer men gebruik maakt van een CollectionViewSource is het niet zoveel werk om gegevens te filteren/sorteren/groeperen. In dit geval worden de gegevens via de WCF-service uit de database gehaald. Deze service bezorgt de gegevens in een DataSet. Het is mogelijk om die DataSet onmiddellijk aan de lijst te koppelen maar dan kan men niet zo eenvoudig filteren/groeperen/sorteren. Daarom worden de gegevens hier bij het laden uit de DataSet gehaald en in een CollectionViewSource opgeslagen. (Eerst worden de gegevens in een ObservableCollection object opgeslagen omdat het niet mogelijk is items toe te voegen aan een CollectionViewSource). public void ladenkandidaten(int demandid) public ObservableCollection<Candidate> candidates = new ObservableCollection<Candidate>(); service = new WSWCFServiceClient(); DataSet ds = service.getcandidatesbydemandid(demandid); Candidate c; for (int i = 0; i < ds.tables[0].rows.count; i++) c = new Candidate(); c.candidateid = (int)ds.tables[0].rows[i]["candidateid"]; c.employeeid = (int)ds.tables[0].rows[i]["employee"]; c.demandid = (int)ds.tables[0].rows[i]["demand"]; c.status = (bool)ds.tables[0].rows[i]["status"];... this.candidates.add(c); listingdataview = (CollectionViewSource)(candidates); Code Listing 76: Kandidaatinformatie uit DataSet halen en opslaan in een CollectionViewSource Filteren Een CollectionViewSource object heeft een filter eigenschap waar we een eventhandler aan kunnen toevoegen om de gegevens te filteren. In onderstaand voorbeeld filteren we alle goedgekeurde kandidaten. Op die manier kunnen we op alle velden van een kandidaat filteren. private void ToonEnkelApproved(object sender, FilterEventArgs e) Candidate can = e.item as Candidate; if (can!= null) if (can.approved) e.accepted = true; else e.accepted = false; private void FilterApprovedAan(object sender, RoutedEventArgs args) listingdataview.filter += new FilterEventHandler(ToonEnkelApproved); Code Listing 77: Filteren van gegevens in een CollectionViewSource Sorteren Aan de SortDescriptions van een CollectionViewSource kan eenvoudig een nieuwe sorteerregel toegevoegd worden. Het is ook mogelijk om er meerdere tegelijkertijd aan te koppelen. 210

213 Dolmen Workflow Services Uitwerking private void SorteerOpNaamAan(object sender, RoutedEventArgs args) listingdataview.sortdescriptions.add(new SortDescription("Name", ListSortDirection.Ascending)); Code Listing 78: Sorteren van gegevens in een CollectionViewSource Groeperen Ook groeperen is met een CollectionViewSource heel eenvoudig. Het volstaat een nieuwe PropertyGroupDescription toe te voegen aan de CollectionViewSource. In dit voorbeeld groeperen we volgens de functie van de kandidaat. private void GroupFunction(object sender, RoutedEventArgs args) PropertyGroupDescription groupdescription = new PropertyGroupDescription(); groupdescription.propertyname = "Function"; listingdataview.groupdescriptions.add(groupdescription); Code Listing 79: Groeperen van gegevens in een CollectionViewSource Om de kandidaten weer te geven in de lijst, wordt de lijst gebind aan de CollectionViewSource. <ListBox Name="Master" ItemsSource="Binding Source=StaticResource listingdataview" <ListBox.Resources> <SolidColorBrush x:key="x:static SystemColors.HighlightBrushKey" Color="LightGreen" /> <SolidColorBrush x:key="x:static SystemColors.ControlBrushKey"Color="LightBlue"/> </ListBox.Resources> <ListBox.GroupStyle> <GroupStyle HeaderTemplate="StaticResource grouptemplate" /> </ListBox.GroupStyle> </ListBox> Code Listing 80: XAML code voor de lijst van kandidaten Binnen de resources van de listbox staan SolidColorBrush tags. Deze dienen om de kleur van een geselecteerd item aan te passen. Via GroupStyle kan je bepalen welke tekst er zichtbaar is boven elke groep (wanneer de gebruiker de inhoud van de lijst groepeert). In dit geval wordt in grouptemplate bepaalt dat de naam van de functie wordt afgebeeld. Nu moet natuurlijk nog bepaald worden welke informatie er te zien is voor iedere kandidaat in de lijst. Dit gaan we bepalen in een DataTemplate. Deze DataTemplate krijgt geen key zoals in vorige gevallen maar een DataType (hier het datatype Candidate). Op die manier zal deze template standaard gebruikt worden wanneer met data van het type Candidate gebruikt. Wil men toch met Candidate werken met een andere template, moet men dat expliciet vermelden. <DataTemplate DataType="x:Type src:candidate"> <Grid Name="masterGrid"> <Image x:name="foto2" Source="http://localhost/ws/images/anoniem.jpg" ></Image> <Image x:name="foto" Source="Binding Path=PhotoUrl" "></Image> <TextBlock Name="name" Style="StaticResource smalltitlestyle">naam:</textblock> <TextBlock x:name="namedt" Text="Binding Path=Name" Style="StaticResource textstyletextblock" /> <TextBlock VerticalAlignment Name="firstName" Style="StaticResource smalltitlestyle">voornaam:</textblock> <TextBlock Name="FirstNameDT Text="Binding Path=FirstName" Style="StaticResource textstyletextblock" /> </Grid> <DataTemplate.Triggers> <DataTrigger Binding="Binding Path=Approved"> <DataTrigger.Value>True</DataTrigger.Value> <Setter Property="Background" Value="LightGreen" TargetName="masterGrid"/> </DataTrigger> 211

214 Dolmen Workflow Services Uitwerking <DataTrigger Binding="Binding Path=Approved"> <DataTrigger.Value>False</DataTrigger.Value> <Setter Property="Background" Value="Pink" TargetName="masterGrid"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> Code Listing 81: DataTemplate voor datatype Candidate Zoals je ziet zijn er ook twee afbeeldingen. De eerst heeft het adres van een anonieme foto (grijs gezicht) terwijl de tweede het adres heeft waar de foto van de kandidaat zou moeten staan. Indien er geen foto aanwezig is van een kandidaat, wordt op die manier de anonieme foto getoond. Is die foto wel aanwezig komt die bovenop de anonieme. Op scherm zie je ook dat reeds goedgekeurde kandidaten een groene achtergrond krijgen en de andere een roze. Dit wordt verwezenlijkt door het gebruikt van DataTriggers AddCandidate.xaml Figuur 116: AddCandidate.xaml Via dit scherm kan een gebruiker een kandidaat toevoegen aan een bepaalde demand. In het Candidates.xaml scherm werd gebruik gemaakt van een CollectionViewSource. Hier wordt geen gebruik gemaakt van filteren/sorteren/groeperen en wordt dus geen gebruik gemaakt van 212

215 Dolmen Workflow Services Uitwerking een CollectionViewSource. Hier worden alle kandidaten opgehaald uit de database (via de WCF-service) en onmiddellijk gekoppeld aan de lijst met mogelijke kandidaten. Dit gebeurt via de DataContext van de pagina. WSWCFServiceClient service = new WSWCFServiceClient(); String demandid = service.getdemandid(wfid); DataSet empds = service.getemployees(); DataTable empdt = empds.tables[0]; DataContext = empdt; Code Listing 82: Kandidaten ophalen en koppelen aan DataContext Het volstaat dan om bij de ItemSource naar Binding te verwijzen om de kandidaten aan de lijst te koppelen. Welke informatie er precies getoond wordt van een kandidaat wordt bepaald door een template (EmployeeListTemplate). Deze template is op een gelijkaardige manier gedefinieerd als deze in Code Listing 74. <ListBox ItemsSource="Binding" ItemTemplate="StaticResource EmployeeListTemplate>ListBox> Code Listing 83: ListBox gebind aan DataContext van de pagina Admin.xaml Figuur 117: Admin.xaml In het volgende stukje in verband met CardSpace zal besproken worden hoe een gebruiker kan inloggen in deze applicatie. Daarvoor moet zijn gebruikeraccount goedgekeurd zijn. Dit kan een administrator doen op deze pagina. Deze pagina bestaat uit twee tabbladen waar een administrator enerzijds aanvragen kan goedkeuren en anderszijds bestaande leden schorsen. Hiervoor werd gebruik gemaakt van een tabcontrol. <TabControl Name="tabControl1" > <TabItem Header="Requests"> <Grid> <ListView x:name="requestlistview" ItemsSource="Binding" > <ListView.View> <GridView > <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Button Click="ApproveClick" CommandParameter="Binding Path=Id" Content="Approve"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> 213

216 Dolmen Workflow Services Uitwerking <GridViewColumn Header="Firstname" DisplayMemberBinding="Binding Path=FirstName"/> <GridViewColumn Header="Lastname" DisplayMemberBinding="Binding Path=LastName"/> <GridViewColumn Header="Function" DisplayMemberBinding="Binding Path=MemberFunction"/> <GridViewColumn Header=" " DisplayMemberBinding="Binding Path= "/> </GridView> </ListView.View> </ListView> </Grid> </TabItem> <TabItem Header="Members"> <Grid> <ListView x:name="memberlistview" ItemsSource="Binding" > <ListView.View> <GridView > <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Button Click="SuspendClick" CommandParameter="Binding Path=Id" Content="Suspend"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Firstname" DisplayMemberBinding="Binding Path=FirstName"/> <GridViewColumn Header="Lastname" DisplayMemberBinding="Binding Path=LastName"/> <GridViewColumn Header="Function" DisplayMemberBinding="Binding Path=MemberFunction"/> <GridViewColumn Header=" " DisplayMemberBinding="Binding Path= "/> </GridView> </ListView.View> </ListView> </Grid> </TabItem> </TabControl> Code Listing 84: Gebruik van een tabcontrol Zoals te zien is in de code maken beide ListViews opnieuw gebruik van een binding binding. Dit wil zeggen dat beide ListViews hun gegevens uit hun datacontext halen. Het bepalen van hun context gebeurt bij het laden van de pagina. private void ladenlistviewrequests() service = new WSWCFServiceClient(); DataSet cands = service.getonlinemembersbyapproved(false); DataTable candt = cands.tables[0]; RequestListView.DataContext = candt; Code Listing 85: Bepalen van de DataContext van een ListView 2.6. Windows CardSpace Het programma moet natuurlijk ook voorzien worden van login systeem zodat er alleen geregistreerde gebruikers gebruik van kunnen maken. Hiervoor gaan we gebruik maken van CardSpace. In de eerste fase van het project ontwikkelden we een applicatie die gebruik maakte van WCF en WF. Toen gebruikten we een ASP.NET-website als grafische user interface. Daarna werd hieraan CardSpace toegevoegd. In 5.7 Gebruik van CardSpace in de praktijk Ontwikkelaar werd reeds besproken hoe een CardSpace-login voor een ASP.NET website kan ontwikkeld worden. Daarna werd de ASP.NET website vervangen door een WPF browser applicatie. Hier botsten we op een probleem. Op het moment van ontwikkeling vonden we geen manier om de CardSpace identity selector te openen via WPF. Ook na het informeren bij Dolmen en het 214

217 Dolmen Workflow Services Uitwerking afschuimen van het internet werd geen oplossing gevonden. Het zou jammer zijn een project te ontwikkelen rond het.net Framework 3.0 waar slechts 3 van de 4 componenten in geintergreerd zijn. Daarom werd naar een alternatief gezocht om toch CardSpace te kunnen gebruiken in dit project. Nu is er de mogelijkheid om via de URL van een WPF browser applicatie parameters mee te geven. Zoals reeds in hoofdstuk 5 (Deel1) werd besproken stuurt CardSpace een token naar de partij die de identiteit wenst te controleren. Indien de CardSpace identitiy selector kan opgeroepen worden via een ASP.NET pagina en het token via de URL kan meegeven worden aan de WPF browser applicatie, kan dat token verwerkt worden binnen die WPF browser applicatie en is het probleem dus opgelost. Helaas, de lengte van het token overschreidt de limiet van de maximale lengte van een dergelijke URL. Om het toch mogelijk te maken CardSpace te gebruiken in het project zal het token verwerkt moeten worden binnen een ASP.NET pagina en zal er op één of andere manier duidelijk gemaakt moeten worden aan de WPF browser applicatie of het al dan niet om een geldige login gaat. Omdat dergelijke informatie doorgegeven wordt via de URL en dus voor de gebruiker zichtbaar is, is dit niet vanzelfsprekend. Door op die manier gebruik te maken van CardSpace, verzwakken we de sterkte van een CardSpace login, daar zijn we ons goed van bewust. Maar het gaat hier in de eerste plaats om een demoapplicatie rond het.net Framework 3.0. Daarom leek het aangewezig zijn van alle vier de componenten belangrijker dan de beveiliging van de applicatie. Hoe dit werd aangepakt zullen we nu bespreken Inloggen - gebruiker Wanneer de gebruiker op de inlogpagina terecht komt, kan hij zowel inloggen met CardSpace als met de klassieke methode met gebruikersnaam en paswoord. Een gebruiker kan de applicatie nodig hebben op verplaatsing, m.a.w. op een pc waar hij niet beschikt over zijn cards of op een machine waar geen CardSpace aanwezig is. Daarom leek het ons nodig om de applicatie ook van een gebruikersnaam-paswoord login te voorzien. Figuur 118: Inlogpagina 215

218 Dolmen Workflow Services Uitwerking Omdat niet zomaar iedereen toegang zou krijgen tot de applicatie moet een gebruiker eerst geregistreerd zijn. Wanneer een gebruiker voor het eerst inlogt met CardSpace komt hij automatisch terecht op de registratiepagina. Op die manier kunnen we informatie opvragen over de gebruiker die niet aanwezig is op zijn card. In dit geval vragen we de functie van de gebruiker. Dan moet de gebruiker wachten op een goedkeuring. Deze goedkeuring wordt gegeven via de Admin pagina in de WPF browser applicatie. Wanneer de gebruiker goedkeuring krijgt, krijgt hij een met een bericht dat zijn registratie geslaagd is, samen met zijn gebruikersnaam en paswoord. Figuur 119: Registratie pagina Figuur 120: Mail met gebruikersnaam en paswoord Vanaf dat moment kan de gebruiker inloggen en gebruik maken van beide manieren van inloggen. Een administrator heeft ook de mogelijkheid om het lidmaatschap van een gebruiker in te trekken. Wanneer de gebruiker rechtstreeks naar de WPF browser applicatie probeert te surfen wordt hij automatisch doorgestuurd naar de inlogpagina Inloggen - werking Nu hebben we gezien hoe het inloggen werkt voor een gebruiker. We gaan nu kijken hoe het inloggen precies in zijn werk gaat. We hebben reeds gezien hoe men in ASP.NET, de identity selector kan oproepen. Deze stuurt dan een token naar een pagina waar het token verwerkt wordt. De methode VerwerkLogin wordt gebruikt om het token te verwerken. De return waarde van deze methode is het adres waarnaar de gebruiker wordt doorgestuurd. public string VerwerkLogin(string t) Token token = new Token(t); string unieke_id = token.uniqueid; DataSet mem = service.getonlinemember(unieke_id); if (mem.tables[0].rows.count == 0) //gebruiker is nog niet geregisteerd return ("register.aspx"); 216

219 Dolmen Workflow Services Uitwerking else if ((bool)mem.tables[0].rows[0]["approved"]) string sn = (string)token.claims[claimtypes.surname]; return GeefStamp(unieke_id, sn); else return ("login.aspx"); Code Listing 86: Verwerken van het security token Eerst wordt gecontroleerd of de gebruiker reeds is geregistreerd. Dit wordt gecontroleerd aan de hand van het unieke id van de card. Is dit niet zo wordt hij doorgestuurd naar de registratie pagina. Is de gebruiker reeds geregistreerd maar is zijn lidmaatschap nog niet goedgekeurd, dan wordt hij teruggestuurd naar de login pagina waar hij een gepaste boodschap te zien krijgt. Is de gebruiker wel geregistreerd en is zijn lidmaatschap goedgekeurd wordt hij doorgestuurd naar de WPF browser applicatie met een url parameter. Deze parameter wordt bepaald in de methode GeefStamp die het id en de familienaam van de gebruiker meekrijgt. public string GeefStamp(string memberid,string surname) string time = DateTime.Now.DayOfYear + "-1-" + DateTime.Now.Minute + "-2-" + DateTime.Now.Second; byte[] encti = new byte[time.length]; encti = System.Text.Encoding.UTF8.GetBytes(time); int xenc = surname.length; string enctoken = ""; for (int i = 0; i < xenc; i++) enctoken = Convert.ToBase64String(encTi); return ("http://localhost/ws/wsxbap2_1_0_0_24.xbap?" + memberid + + enctoken); Code Listing 87: Creatie van stamp We moeten dus de op een of andere manier aan de WPF browser applicatie duidelijk maken of het gaat om een geldige login. Omdat de WPF browser applicatie de gebruiker zou kunnen identificeren geven we de id mee van de gebruikte card. Dit alleen volstaat natuurlijk niet. Iemand kan dat id gemakkelijk uit de browser aflezen en later opnieuw gebruiken. Daarom gaan we ook een timestamp meegeven. Deze bestaat uit de dag, de minuut en de seconde van het moment dat het token verwerkt wordt. Het uur wordt niet gebruikt omdat gebruikers zich eventueel in een andere tijdszone kunnen bevinden. Deze timestamp wordt vervolgens x aantal keer geconverteerd (Base64) waarbij x staat voor de lengte van de familienaam van de gebruiker. Id en timestamp worden gescheiden door zodat we in de WPF browser applicatie beide makkelijk kunnen onderscheiden. In de praktijk ziet een time stamp er zo uit: 217

220 Dolmen Workflow Services Uitwerking Laten we nu eens bekijken hoe de WPF browser applicatie het token controleert. Bij het starten van de applicatie wordt de code in de methode geladen uitgevoerd. In deze methode wordt nagegaan of de timestamp geldig is. public void geladen(object sender, RoutedEventArgs e) //ophalen url parameter try test = System.Windows.Interop.BrowserInteropHelper.Source.Query; catch(exception) this.navigationservice.navigate(new Uri("https://www.fabrikam.com/demandservice/login.aspx")); try //id en stamp uit de url filteren string id = query.substring(1, - 1); string stamp = + 2); //ophalen familienaam WSWCFServiceClient service = new WSWCFServiceClient(); DataSet can = service.getonlinemember(id); string lastname = (string)can.tables[0].rows[0]["lastname"]; //decoderen van de timestamp/////////////////// System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); System.Text.Decoder utf8decode = encoder.getdecoder(); byte[] todecode_byte = Convert.FromBase64String(stamp); int charcount = utf8decode.getcharcount(todecode_byte, 0, todecode_byte.length); char[] decoded_char = new char[charcount]; for (int i = 0; i < lastname.length; i++) utf8decode.getchars(todecode_byte, 0, todecode_byte.length, decoded_char, 0); string result = new String(decoded_char); /////////////////////////////////////////////// //dag min en sec uit stamp filteren int dag = Int32.Parse(result.Substring(0, result.indexof("-1-"))); int min = Int32.Parse(result.Substring((result.IndexOf("-1-") + 3), (result.indexof("-2-") - (result.indexof("-1-") + 3)))); int sec = Int32.Parse(result.Substring(result.IndexOf("-2-") + 3)); //huidige dag min en sec bepalden int huidig_dag = DateTime.Now.DayOfYear; int huidig_min = DateTime.Now.Minute; int huidig_sec = DateTime.Now.Second; int aantalsec = 0; bool geldigloginticket; //aantal seconden bepalen tussen ticket en huidge if (huidig_sec - sec < 0) aantalsec = (huidig_sec - sec) + 60; if (huidig_min == min + 1 && aantalsec <= GELDIGHEIDSDUURTICKET) geldigloginticket = true; else geldigloginticket = false; else aantalsec = huidig_sec - sec; if (huidig_min == min && aantalsec <= GELDIGHEIDSDUURTICKET) geldigloginticket = true; else geldigloginticket = false; 218

221 Dolmen Workflow Services Uitwerking if (geldigloginticket) DemandsPage dem = new DemandsPage(); this.navigationservice.navigate(dem); else this.navigationservice.navigate(new Uri("https://www.fabrikam.com/demandservice/login.aspx")); catch (Exception ex) label1.content = "Fout in ticket"; label1.content += ex.tostring(); Code Listing 88: Valideren van de timestamp Eerst wordt de url-parameter opgehaald en wordt het id en timestamp eruit gefilterd. Daarna wordt de timestamp opnieuw geconverteerd naar zijn normale notatie. Hiervoor is de familienaam van de gebruiker nodig. Deze wordt opgehaald via onze WCF-service. Wanneer de timestamp terug in zijn normale notatie beschikbaar is, gaan we er de dag, minuut en seconden gaan uithalen. Tevens bepalen we de huidige dag, minuut en seconde. Daarna gaan we het aantal seconden bepalen dat verstreken is tussen het versturen van de timestamp en het huidige tijdstip. Wanneer dit verschil binnen een bepaalde limiet valt, wordt de timestamp als geldig beschouwd. Deze limiet kan ingesteld worden via de constante GELDIGHEIDSDUURTICKET. Op die manier wordt vermeden dat een bepaalde timestamp op een later ogenblik opnieuw wordt gebruikt. Op basis van de geldigheid van de timestamp wordt de gebruiker naar de juiste pagina gestuurd. Deze manier van beveiliging zal in de praktijk natuurlijk nooit worden gebruikt. Wanneer men CardSpace wenst te gebruiken in een WPF-applicatie zal men CardSpace moeten kunnen oproepen vanuit WPF om de kracht van CardSpace te kunnen behouden ASP.NET De ASP.NET website is de eerste interface die we gemaakt hebben om de applicatie in een eerste fase te kunnen gebruiken. Deze gui is dus een basisversie en is er enkel om de functionaliteit naar buiten te brengen voor testdoeleinden. In een latere fase werd de ASP.NET website volledig vervangen (buiten het inlogscherm) door een WPF browser applicatie. 219

222 Dolmen Workflow Services Uitwerking Figuur 121: ASP.NET website als grafische user interface 220

223 Dolmen Workflow Services Handleiding voor installatie Hoofdstuk 3 Handleiding voor installatie Om dat het draaiende krijgen van ons project niet zo eenvoudig is, leek het toch handig hiervoor een korte handleiding te schrijven. In de map Software zijn 3 Visual Studio solutions aanwezig: WorkflowServices: deze bevat de WCF-service en alle workflow logica (WF). WSWCFAspClient: deze bevat de ASP.NET paginas die de login en registratie mogelijk maken. WSXBAP: de WPF applicatie die getoond wordt via de browser. Verder is ook een map Certificaten aanwezig die we later gaan nodig hebben. We zullen hier de installatie bespreken op een Windows XP Pro machine. We kiezen hier bewust niet voor Windows Vista omdat we tijdens het ontwikkelen gemerkt hebben dat Internet Information Services (IIS) van Vista niet foutloos werkt. 1) Installatie van Visual Studio 2005 of recenter. 2) Installatie van het.net Framework 3.0. Gratis te downloaden op 3) Installatie van de databases: a. In ons proefproject hebben we gekozen voor een Microsoft SQL Server 2005 database. In ons project hebben we een database voor de workflows(persistence) en een database voor data ivm demands, werknemers,. In de map AfgewerkteSoftware/DatabaseScripts zijn de scripts terug te vinden om de databases te creëren. De databases hebben dezelfde naam als deze van de scripts. 4) Instellen van IIS: a. Servercertificaat instellen. Hoe dit gebeurt wordt in detail besproken in Certificaat van de relying party. De nodige certificaten zijn terug te vinden in de map AfgewerkteSoftware/Certificaten. b toevoegen aan het bestand C:\WINDOWS\system32\drivers\etc zodat we localhost kunnen aanspreken als c. Maak een nieuwe virtuele map demandservice aan die verwijst naar het ASP.NET project en een virtuele map ws die verwijst naar de map c:\publish (hier kiezen we voor c:\publish maar hiervoor kan elke map gekozen worden. In deze map zullen we de WPF applicatie publishen). 5) Installeren van het certificaat van de WPF applicatie a. In de map AfgewerkteSoftware\WSXBAP2 is een certificaat terug te vinden met de naam WSXBAP2_TemporaryKey.pfx. Dit certificaat moet geïnstalleerd worden in de mappen Vertrouwde certificeringinstanties en Vertrouwde uitgevers. Dit doet men via Start > Uitvoeren > MMC. Bestand > Module toevoegen. Dan Certificaten selecteren en voor Computeraccount kiezen. 6) Installeren CardSpace: op een XP machine volstaat het Internet Explorer 7 te installeren. Via het configuratiescherm kan men dan het CardSpace configuratie venster openen. Hierin volstaat het een aantal self-issued cards te creëren. Runnen van de demoapplicatie 221

224 Dolmen Workflow Services Handleiding voor installatie WCF-service: terug te vinden in het project WorkflowServices: de eenvoudigste manier om de WCF-service op te starten is het.exe bestand te openen in de map WorkflowServices\WorkflowServices\bin\Debug van het WorkflowServices project. Hierbij wordt een arbitrair proces gestart. Wordt dit proces beëindigd, stopt ook de service. ASP.NET website: deze is terug te vinden in het project WSWCFAspClient. Via de virtuele map demandservice die naar deze website verwijst kunnen we nu via de browser surfen naar https://www.fabrikam.com/demandservice/login.aspx om de login pagina te openen. WPF-applicatie: aanwezig in de het project WSXBAP. Om deze applicatie te kunnen gebruiken in dit project moet deze applicatie gepublished worden. Dit omdat voor de login een parameter meegegeven wordt in het adres van de WPF-applicatie. Zou deze lokaal draaien, kan geen parameter meegegeven worden. Publishen is eenvoudig: 1. Open het project in Visual Studio. 2. Rechtermuisklik op het project > Publish (zie Figuur 122) 3. Dan wordt een wizard geopend. In de eerst stap wordt een locatie gevraagd. Hier kiezen we voor de lokale map c:\publish (of andere naam, zie stap 4c). 4. In de volgende wizard stap kiezen we voor From CD-ROM or DVD-ROM. 5. In de volgende stap kiezen we voor This application will not check for updates. 6. Dan kiezen we voor finish. 7. In de map waar we de WPF-applicatie hebben gepublished is nu een setup.exe bestand aanwezig. Vooraleer we de applicatie kunnen gebruiken moet deze uitgevoerd worden. Eens dat is gebeurt kunnen we gebruik maken van de WPF-applicatie. Figuur 122: Publishen van WPF-applicatie Surfen we nu naar https://www.fabrikam.com/demandservice/login.aspx kunnen we nu inloggen om gebruik te maken van het proefproject. Vergeet niet dat de WCF-service actief moet zijn! 222

Introductie.NET Framework 3.0 A N D R É O B E LIN K, M C S D, M V P

Introductie.NET Framework 3.0 A N D R É O B E LIN K, M C S D, M V P Introductie.NET Framework 3.0 A N D R É O B E LIN K, M C S D, M V P About me Technical Manager / lead developer Actief in de Visual Basic en.net community www.vbcentral.nl, VP Speakers Bureau INETA Europe

Nadere informatie

SOA Security. en de rol van de auditor... ISACA Roundtable 2 juni 2008. Arthur Donkers, 1Secure BV arthur@1secure.nl

SOA Security. en de rol van de auditor... ISACA Roundtable 2 juni 2008. Arthur Donkers, 1Secure BV arthur@1secure.nl SOA Security en de rol van de auditor... ISACA Roundtable 2 juni 2008 Arthur Donkers, 1Secure BV arthur@1secure.nl 1 SOA Web 2.0, web services en service oriented architecture (SOA) is tegenwoordig de

Nadere informatie

Zelftest Java EE Architectuur

Zelftest Java EE Architectuur Zelftest Java EE Architectuur Document: n1218test.fm 22/03/2012 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST JAVA EE ARCHITECTUUR Nota:

Nadere informatie

Zelftest Java concepten

Zelftest Java concepten Zelftest Java concepten Document: n0838test.fm 22/03/2012 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST JAVA CONCEPTEN Om de voorkennis nodig

Nadere informatie

ManualMaster Systeem 6.1 (ManualMaster Administrator, ManualMaster WebAccess en ManualMaster WebEdit)

ManualMaster Systeem 6.1 (ManualMaster Administrator, ManualMaster WebAccess en ManualMaster WebEdit) Let op: de versie op de gebruikerswebsite kan worden bijgewerkt! Het kan dus zijn dat uw geprinte versie verouderd is. Van toepassing op ManualMaster Systeem 6.1 (ManualMaster Administrator, ManualMaster

Nadere informatie

Dit voorbeeldproject beschrijft het gebruik van web services (open standaarden) voor de ontsluiting van kernregistraties bij de gemeente Den Haag.

Dit voorbeeldproject beschrijft het gebruik van web services (open standaarden) voor de ontsluiting van kernregistraties bij de gemeente Den Haag. Voorbeeldproject Een Haagse SOA Dit voorbeeldproject beschrijft het gebruik van web services (open standaarden) voor de ontsluiting van kernregistraties bij de gemeente Den Haag. Aanleiding Vanuit de visie

Nadere informatie

Technische FAQ koppelvlak WUS 2.0 voor bedrijven

Technische FAQ koppelvlak WUS 2.0 voor bedrijven Technische FAQ koppelvlak WUS 2.0 voor bedrijven Versie 1.0 Datum 25 juli 2012 Status Definitief Colofon Projectnaam Versienummer Contactpersoon Organisatie Logius Postbus 96810 2509 JE Den Haag servicecentrum@logius.nl

Nadere informatie

INHOUDSOPGAVE 3. 3.5 Het Boekenwinkeltje... 90 3.5.1 Registreer.aspx... 90 3.6 Opgaven... 97

INHOUDSOPGAVE 3. 3.5 Het Boekenwinkeltje... 90 3.5.1 Registreer.aspx... 90 3.6 Opgaven... 97 Inhoudsopgave 1 Inleiding 8 1.1 Het.Net Framework................................ 8 1.1.1 Het.Net Ontwikkelingsmodel....................... 8 1.1.2 Compilatie en Uitvoering in.net.....................

Nadere informatie

Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat

Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat Wat is een database? Een verzameling van georganiseerde data Een database bestaat uit applicaties, SQL en het DBMS Watis eendbms? EenDBMS

Nadere informatie

Service Oriented Architecture

Service Oriented Architecture Service Oriented Architecture From architecture to.net 3.0 implementation Reinhard Brongers Donald Hessing VX Company VX Company www.vxcompany.com Agenda SOA, Services en Tenets Bericht en WCF ABC Contract

Nadere informatie

Capita Selecta Design Patterns voor administratieve applicaties

Capita Selecta Design Patterns voor administratieve applicaties Capita Selecta voor administratieve applicaties Bij afstudeerproject: Generiek framework voor administratieve toepassingen in een webgeörienteerde omgeving Henk van de Ridder 26 augustus 2006 Inhoud 26

Nadere informatie

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag ArcGIS Mobile ADF Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag Agenda Wat is de Mobile ADF? Architectuur Demo Wat is de mobile ADF? Ontwikkeltoolkit voor mobiele (Smart Client)

Nadere informatie

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: Eenvoudig voorbeeld. Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt. Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: (Sommige schermafdrukken zijn afkomstig

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

Versturen van email vanuit een Delphi VCL toepassing

Versturen van email vanuit een Delphi VCL toepassing Versturen van email vanuit een Delphi VCL toepassing Voor Delphi bestaan uiteraard verschillende libraries om emails te versturen, maar in dit voorbeeld wordt een C# Dotnet library gebruikt en aangesproken

Nadere informatie

Programming Content Management Server 2002

Programming Content Management Server 2002 Met behulp van Content Management Server 2002 (CMS) kun je eenvoudig te onderhouden websites bouwen en beheren. De business driver van CMS is het gebruiksvriendelijk beheer van een website, in het bijzonder

Nadere informatie

Enterprise SSO Manager (E-SSOM) Security Model

Enterprise SSO Manager (E-SSOM) Security Model Enterprise SSO Manager (E-SSOM) Security Model INHOUD Over Tools4ever...3 Enterprise Single Sign On Manager (E-SSOM)...3 Security Architectuur E-SSOM...4 OVER TOOLS4EVER Tools4ever biedt sinds 2004 een

Nadere informatie

Single sign on kan dé oplossing zijn

Single sign on kan dé oplossing zijn Whitepaper Single sign on kan dé oplossing zijn door Martijn Bellaard Martijn Bellaard is lead architect bij TriOpSys en expert op het gebied van security. De doorsnee ICT-omgeving is langzaam gegroeid

Nadere informatie

Organiseer uw verschillende SOAP services in één scenario

Organiseer uw verschillende SOAP services in één scenario 1 Organiseer uw verschillende SOAP services in één scenario Wouter Luijten wouterluijten@creetion.com 2 Introductie Tijdens de implementatie van een proces heeft u vaak te maken met een veelvoud aan services.

Nadere informatie

UBC op Microsoft Windows 64-bits

UBC op Microsoft Windows 64-bits UBC op Microsoft Windows 64-bits Inleiding Op de 64-bits varianten van Windows werkt de UBC (en vele andere pakketten) op een andere manier dan op de oudere 32-bits varianten van deze Windows versies.

Nadere informatie

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise Inhoudsopgave 1. Voorbereiding... 4 2. Web Service Connector tool configuratie... 5 3. TaskCentre taak voor het aanmaken van

Nadere informatie

Functionele beschrijving: scannen naar Exact Globe.

Functionele beschrijving: scannen naar Exact Globe. Functionele beschrijving: scannen naar Exact Globe. Algemeen Met de KYOCERA scannen naar Exact Globe beschikt u over een efficiënte oplossing om uw documenten te scannen naar Exact Globe. Met deze oplossing

Nadere informatie

Een ASP.NET applicatie opzetten. Beginsituatie:

Een ASP.NET applicatie opzetten. Beginsituatie: Hoofdstuk 1 Een ASP.NET applicatie opzetten Beginsituatie: Windows XP Pro, Windows Vista Pro of Windows 7 Pro Visual Studio.NET moet zijn geïnstalleerd. Let hierbij op dat de Express versie niet voldoet.

Nadere informatie

Functionele beschrijving: scannen naar UNIT4 DocumentManager

Functionele beschrijving: scannen naar UNIT4 DocumentManager Functionele beschrijving: scannen naar UNIT4 DocumentManager Algemeen Met de KYOCERA Scannen naar UNIT4 DocumentManager beschikt u over een efficiënte oplossing om uw documenten te scannen naar UNIT4 DocumentManager

Nadere informatie

Absentie Presentie Server Migratie

Absentie Presentie Server Migratie Absentie Presentie Server Migratie Auteur A. Boerkamp Versie V1.2 Datum 11-08-2010 Status Voor Intern / Extern gebruik Pincash International, 3066GS Rotterdam, Anthonetta Kuijlstraat 43-45, 010-2868000

Nadere informatie

Handleiding Inloggen met SSL VPN

Handleiding Inloggen met SSL VPN Handleiding Inloggen met SSL VPN Beveiligd verbinding maken met het bedrijfsnetwerk via de Desktop Portal Versie: 24 april 2012 Handleiding SSL-VPN Pagina 1 van 10 Inleiding SSL VPN is een technologie

Nadere informatie

Handleiding voor het inloggen op Terminal Server van GLT-PLUS

Handleiding voor het inloggen op Terminal Server van GLT-PLUS Handleiding voor het inloggen op Terminal Server van GLT-PLUS Voor inloggen vanuit huis, GLT en NAM Geschreven door: Business Information Datum: 4-5-2011 ENOVIA: 01335559-0001 rev D ENOVIA nummer: 01335559-0001

Nadere informatie

1.1 Installatie Solid Edge ST3

1.1 Installatie Solid Edge ST3 1.1 Installatie Solid Edge ST3 1 : Installeren : SE is niet achterwaarts compatibel, dit betekent dat een tekening gemaakt in een hogere versie, niet in een lagere versie van SE kan geopend worden. Omgekeerd

Nadere informatie

Technische nota AbiFire5 Rapporten maken via ODBC

Technische nota AbiFire5 Rapporten maken via ODBC Technische nota AbiFire5 Rapporten maken via ODBC Laatste revisie: 29 juli 2009 Inhoudsopgave Inleiding... 2 1 Installatie ODBC driver... 2 2 Systeeminstellingen in AbiFire5... 3 2.1 Aanmaken extern profiel...

Nadere informatie

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Om eens wat ervaring op te doen met de Windows Azure Marketplace heb ik een publieke en gratis databron gekozen

Nadere informatie

Technisch Ontwerp W e b s i t e W O S I

Technisch Ontwerp W e b s i t e W O S I Technisch Ontwerp W e b s i t e W O S I WOSI Ruud Jungbacker en Michael de Vries - Technisch ontwerp Website Document historie Versie(s) Versie Datum Status Omschrijving / wijzigingen 0.1 20 nov 2008 Concept

Nadere informatie

Perceptive Process. Technische Specificaties. Versie: 3.4.x

Perceptive Process. Technische Specificaties. Versie: 3.4.x Perceptive Process Technische s Versie: 3.4.x Geschreven door: Product Documentation, R&D Datum: Mei 2015 2015 Lexmark International Technology, S.A. Alle rechten voorbehouden. Lexmark is een hadelsmerk

Nadere informatie

Inhoudsopgave. Hoofdstuk 1.JMS...2

Inhoudsopgave. Hoofdstuk 1.JMS...2 Inhoudsopgave Hoofdstuk 1.JMS...2 1.1.Inleiding...2 1.2.Messaging architectuur...3 1.2.1.Point to point domein...3 1.2.2.Publish/Subscribe domein...4 1.2.3.Synchrone - asynchrone verwerking...4 1.2.4.De

Nadere informatie

Uitgebreid voorstel Masterproef Informatica

Uitgebreid voorstel Masterproef Informatica DEPARTEMENT TOEGEPASTE INGENIEURSWETENSCHAPPEN CAMPUS SCHOONMEERSEN - GENT Uitgebreid voorstel Masterproef Informatica Datum: 1/11/2008 Naam student: Pieter Vancoillie Algemene informatie: Naam van het

Nadere informatie

Uitgebreid voorstel Masterproef Informatica

Uitgebreid voorstel Masterproef Informatica HoGent Uitgebreid voorstel Masterproef Informatica Titel van het project: Optimalisatie & ontwikkeling van een gegevenstransfertool voor Business Intelligence-gebruikers Datum : 01/11/2012 Naam student

Nadere informatie

HANDLEIDING DMS Plugin Installatie, configuratie & werking

HANDLEIDING DMS Plugin Installatie, configuratie & werking HANDLEIDING DMS Plugin Installatie, configuratie & werking Dit document is de handleiding voor de installatie, configuratie en werking van de DMS Plugin. Versie 1-12/09/2005 Inhoudstafel 1 Installatie...

Nadere informatie

SURFconext Cookbook. Het koppelen van Alfresco aan SURFconext. Versie: 1.0. Datum: 8 december 2013. 030-2 305 305 admin@surfnet.nl www.surfnet.

SURFconext Cookbook. Het koppelen van Alfresco aan SURFconext. Versie: 1.0. Datum: 8 december 2013. 030-2 305 305 admin@surfnet.nl www.surfnet. SURFconext Cookbook Het koppelen van Alfresco aan SURFconext Auteur(s): Frank Niesten Versie: 1.0 Datum: 8 december 2013 Radboudkwartier 273 3511 CK Utrecht Postbus 19035 3501 DA Utrecht 030-2 305 305

Nadere informatie

1.1 Installatie Solid Edge ST6

1.1 Installatie Solid Edge ST6 1.1 Installatie Solid Edge ST6 1 : Installeren : SE is niet achterwaarts compatibel, dit betekent dat een tekening gemaakt in een hogere versie, niet in een lagere versie van SE kan geopend worden. Omgekeerd

Nadere informatie

Curriculum Vitae. Ing. R. van de Roer (Rogier) Geboortedatum: 10 oktober 1975. Informatica / Informatiekunde, Den Haag

Curriculum Vitae. Ing. R. van de Roer (Rogier) Geboortedatum: 10 oktober 1975. Informatica / Informatiekunde, Den Haag Willem van der Kulkstraat 4 3059 TM Rotterdam M: +31 (0)6-44 708 444 I: www.stirsolutions.nl E: info@stirsolutions.nl Curriculum Vitae Naam: Ing. R. van de Roer (Rogier) Geboortedatum: 10 oktober 1975

Nadere informatie

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet. Hoofdstuk 2 Een ASP.NET applicatie met ADO.NET opzetten In dit hoofdstuk ga je een eenvoudige website opzetten, waarbij je een aantal gegevens uit een database ophaalt. Je moet je kennis van ADO.NET dus

Nadere informatie

Tijdens de PDC in oktober 2003 is Indigo voor het eerst

Tijdens de PDC in oktober 2003 is Indigo voor het eerst Gijs de Jong is senior consultant bij Microsoft Services Programmeren met Indigo G E Ü N I F I C E E R D F R A M E WO R K VO O R S E RV I C E G E O R I Ë N T E E R D E A P P L I C AT I E S O P H E T W

Nadere informatie

Security web services

Security web services Security web services Inleiding Tegenwoordig zijn er allerlei applicaties te benaderen via het internet. Voor bedrijven zorgt dit dat zei de klanten snel kunnen benaderen en aanpassingen voor iedereen

Nadere informatie

Software Processen. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1. Het software proces

Software Processen. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1. Het software proces Software Processen Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1 Het software proces Een gestructureerd set van activiteiten nodig om een software systeem te ontwikkelen Specificatie;

Nadere informatie

SHAREPOINT ONLINE (SAMEN-)WERKEN IN DE WOLKEN. http://www.ie-net.be - Workshop SharePoint 1

SHAREPOINT ONLINE (SAMEN-)WERKEN IN DE WOLKEN. http://www.ie-net.be - Workshop SharePoint 1 SHAREPOINT ONLINE (SAMEN-)WERKEN IN DE WOLKEN 1 WIE ZIJN WIJ? 2 WIE BENT U? Professional Op zoek naar productiviteit Samenwerken met Collega s Externe partijen Onderaannemers 3 WAT IS ONS PLAN? 1. Wat

Nadere informatie

Ondersteuning van zorg gerelateerde processen en activiteiten voor patiënt en zorgverstrekkers

Ondersteuning van zorg gerelateerde processen en activiteiten voor patiënt en zorgverstrekkers Ondersteuning van zorg gerelateerde processen en activiteiten voor patiënt en zorgverstrekkers Contact persoon: Thera Splinter: 020 6445160 team@webfysio.nl Contact persoon: Joost Nagelmaeker: 0642115336

Nadere informatie

The OSI Reference Model

The OSI Reference Model Telematica Applicatielaag Hoofdstuk 16, 17 Applicatielaag 4Bevat alle toepassingen die van het netwerk gebruik maken n E-mail n Elektronisch nieuws n WWW n EDI (Electronic Data Interchange) n Napster,

Nadere informatie

Model driven Application Delivery

Model driven Application Delivery Model driven Application Delivery Fast. Flexible. Future-proof. How Agis streamlines health procurement using Mendix Model driven Application Platform Mendix in a nutshell Mendix delivers the tools and

Nadere informatie

Functionele beschrijving: Scannen naar AFAS Profit.

Functionele beschrijving: Scannen naar AFAS Profit. Functionele beschrijving: Scannen naar AFAS Profit. Algemeen Met de Kyocera Scannen naar AFAS Profit beschikt u over een efficiënte oplossing om uw documenten te scannen naar AFAS Profit. Met deze oplossing

Nadere informatie

Functionele beschrijving: scannen naar van Brug software.

Functionele beschrijving: scannen naar van Brug software. Functionele beschrijving: scannen naar van Brug software. Algemeen Met de KYOCERA scannen naar van Brug Software beschikt u over een efficiënte oplossing om uw documenten te scannen naar het Notarieel

Nadere informatie

SKILLS (Ervaring in jaren)

SKILLS (Ervaring in jaren) Contact the Agency Laurens Simonse 02201031 L.simonse@lsg.nl Bart Nijskens 052302211 B.nijskens@lsg.nl ROCKSTARS Rob Roepnaam: Rob Regio: Eindhoven Geboortedatum: 23 maart 19 Nationaliteit: Nederlands

Nadere informatie

Curriculum Vitae. Duco is bij Quintor momenteel met een masterclass ASP.NET / MVC bezig.

Curriculum Vitae. Duco is bij Quintor momenteel met een masterclass ASP.NET / MVC bezig. Curriculum Vitae Duco Winterwerp Nationaliteit: Nederlandse Rijbewijs: ja (BE, AM) Website: www.duco.cc E-mailadres: duco@winterwerp.it Datum: februari Duco Winterwerp heeft Informatica gestudeerd aan

Nadere informatie

Beveiligingsbeleid Perflectie. Architectuur & Procedures

Beveiligingsbeleid Perflectie. Architectuur & Procedures Beveiligingsbeleid Perflectie Architectuur & Procedures 30 november 2015 Versiebeheer Naam Functie Datum Versie Dimitri Tholen Software Architect 12 december 2014 0.1 Dimitri Tholen Software Architect

Nadere informatie

Installatie Avalanche Webview

Installatie Avalanche Webview Installatie Avalanche Webview Deze handleiding beschrijft de stappen om software voor Avalanche Webview op een huidige omgeving te updaten en te installeren. 1. Deïnstalleer de huidige Avalanche Webview

Nadere informatie

Welkom bij IT-Workz. Etten-Leur, 16 november 2010. Altijd en overal werken en leren. Applicatie en Desktop Delivery met Quest vworkspace

Welkom bij IT-Workz. Etten-Leur, 16 november 2010. Altijd en overal werken en leren. Applicatie en Desktop Delivery met Quest vworkspace Welkom bij IT-Workz Altijd en overal werken en leren Applicatie en Desktop Delivery met Quest vworkspace Etten-Leur, 16 november 2010 IT-Workz is de verzelfstandigde Dienst ICT van het ROC West-Brabant.

Nadere informatie

DE ELEKTRONISCHE IDENTITEITSKAART (EID)

DE ELEKTRONISCHE IDENTITEITSKAART (EID) DE ELEKTRONISCHE IDENTITEITSKAART (EID) MS OFFICE 2007 (WINDOWS - WORD EN EXCEL) VERSIE 1.1.1 NL Disclaimer Fedict is niet verantwoordelijk voor om het even welke schade die een derde zou ondervinden ingevolge

Nadere informatie

Installatie van sqlserver

Installatie van sqlserver Installatie van sqlserver Download SQLserver 2005 Express basis van de website van 2work: www.2work.nl, tabblad downloads; beveiligde zone. De inlog gegevens kunnen via de helpdesk aangevraagd worden.

Nadere informatie

Uitgebreid voorstel Masterproef Informatica. Titel van het project : Ontwikkeling van remote controlled Alert & Task Agent

Uitgebreid voorstel Masterproef Informatica. Titel van het project : Ontwikkeling van remote controlled Alert & Task Agent HoGent Uitgebreid voorstel Masterproef Informatica Titel van het project : Ontwikkeling van remote controlled Alert & Task Agent Datum: Naam student: Glenn Jacob Interne promotor: Wim Van den Breen In

Nadere informatie

Contact the Agency Laurens Simonse 06 22801031 laurens@rockstars-it.nl. Bart Nijskens 06 52302211 bart@rockstars-it.nl. Gijs-Jan. Roepnaam: Gijs-Jan

Contact the Agency Laurens Simonse 06 22801031 laurens@rockstars-it.nl. Bart Nijskens 06 52302211 bart@rockstars-it.nl. Gijs-Jan. Roepnaam: Gijs-Jan Contact the Agency Laurens Simonse 06 22801031 laurens@rockstars-it.nl Bart Nijskens 06 52302211 bart@rockstars-it.nl Gijs-Jan Roepnaam: Gijs-Jan Regio: Gelderland Geboortedatum: 06-01-1983 Nationaliteit:

Nadere informatie

Technisch ontwerp. Projectteam 6. Project "Web Essentials" 02 april 2009. Versie 2.1.0

Technisch ontwerp. Projectteam 6. Project Web Essentials 02 april 2009. Versie 2.1.0 Projectteam 6 Faculteit Natuur en Techniek Hogeschool Utrecht Projectleider: Hans Allis, hans.allis@student.hu.nl Technisch ontwerp Project "Web Essentials" 02 april 2009 Versie 2.1.0 Teamleden: Armin

Nadere informatie

Gebruikershandleiding. StUF Testplatform Versie 1.3.0

Gebruikershandleiding. StUF Testplatform Versie 1.3.0 Gebruikershandleiding StUF Testplatform Versie 1.3.0 Documentversie: 0.7 Datum 25 november 2014 Status In gebruik Inhoudsopgave 1 INLEIDING...3 2 GEBRUIK MAKEN VAN HET STUF TESTPLATFORM...4 2.1 INLOGGEN

Nadere informatie

Stappenplannen MailPlus SOAP API

Stappenplannen MailPlus SOAP API Stappenplannen MailPlus SOAP API Stappenplannen MailPlus SOAP API oktober 2009 Introductie Dit document bevat stappenplannen welke u als technische gebruiker van MailPlus op weg kunnen helpen met de koppeling

Nadere informatie

Perceptive Process Design & Enterprise 3.0.3. Ondersteunde platformen

Perceptive Process Design & Enterprise 3.0.3. Ondersteunde platformen Perceptive Process Design & Enterprise 3.0.3 Ondersteunde platformen 2013 Lexmark International Technology S.A. Datum: 10/28/2013 Versie: 3.0.3 Perceptive Software is a trademark of Lexmark International

Nadere informatie

DrICTVoip.dll v 2.1 Informatie en handleiding

DrICTVoip.dll v 2.1 Informatie en handleiding DrICTVoip.dll v 2.1 Informatie en handleiding Nieuw in deze versie : Koppeling voor web gebaseerde toepassingen (DrICTVoIPwebClient.exe) (zie hoofdstuk 8) 1. Inleiding Met de DrICTVoIP.DLL maakt u uw software

Nadere informatie

Samengaan van Geo-informatie en Service Oriëntatie

Samengaan van Geo-informatie en Service Oriëntatie Samengaan van Geo-informatie en Service Oriëntatie Waterbodem Applicatie (WAB*info) 10 juli 2008 Gaston Lamaitre Data-ICT-Dienst, Delft Inhoud Wat doet Rijkswaterstaat? Doel van WAB*info De randvoorwaarden

Nadere informatie

Installatie en configuratie documentatie

Installatie en configuratie documentatie Installatie en configuratie documentatie Assistance Web Portal v. 2.x Voor Windows 2003 / XP / Vista Assistance PSO handleiding, uitgegeven door Assistance Software. Alle rechten voorbehouden. Niets uit

Nadere informatie

Taxis Pitane SQL beheerder. Censys BV - Eindhoven

Taxis Pitane SQL beheerder. Censys BV - Eindhoven Taxis Pitane SQL beheerder Censys BV - Eindhoven Inhoud Wat is Taxis Pitane SQL beheerder?... 3 Kenmerken van de software... 3 De juiste SQL server editie voor uw organisatie... 3 SQL Server 2008 Express...

Nadere informatie

Werkomgeving. Android Studio. Android - werkomgeving 1/6

Werkomgeving. Android Studio. Android - werkomgeving 1/6 Android - werkomgeving 1/6 Werkomgeving Android Studio Installatie Ga naar de volgende URL: http://developer.android.com/sdk/index.html Klik op de knop "Download Android Studio for Windows" om het programma

Nadere informatie

MSSL Dienstbeschrijving

MSSL Dienstbeschrijving MSSL Dienstbeschrijving Versie : 1.0 Datum : 28 augustus 2007 Auteur : MH/ME Pagina 2 van 7 Inhoudsopgave Inhoudsopgave... Fout! Bladwijzer niet gedefinieerd. Introductie... 3 Divinet.nl Mssl... 3 Hoe

Nadere informatie

Systeemvereisten. Systeemvereisten voor Microsoft Dynamics NAV 2009. Rolgebaseerde client

Systeemvereisten. Systeemvereisten voor Microsoft Dynamics NAV 2009. Rolgebaseerde client Systeemvereisten voor Microsoft Dynamics NAV 2009 Rolgebaseerde client Microsoft Windows XP Professional SP3 of later (X86 of 32-bits Microsoft Windows Vista (Business, Enterprise, of Ultimate) SP1 of

Nadere informatie

asp.net / c# / Sql Server programmeur Persoonskenmerken: geduldig, sociaal, integer, innemend, vastberaden, buiten eigen denkkader denken.

asp.net / c# / Sql Server programmeur Persoonskenmerken: geduldig, sociaal, integer, innemend, vastberaden, buiten eigen denkkader denken. Jaap Goddijn en architect asp.net / c# / Sql Server programmeur Persoonlijke gegevens Naam: Jaap Goddijn Geboortedatum: 20 juli 1974 Woonplaats: Utrecht Email: jaap.goddijn@quebuss.nl Telefoon: 06 151

Nadere informatie

Installatie SQL: Server 2008R2

Installatie SQL: Server 2008R2 Installatie SQL: Server 2008R2 Download de SQL Server 2008.exe van onze site: www.2work.nl Ga naar het tabblad: Downloads en meld aan met: klant2work en als wachtwoord: xs4customer Let op! Indien u een

Nadere informatie

Onder de motorkap van Microsoft Azure Web Sites. Eelco Koster Software architect ORDINA

Onder de motorkap van Microsoft Azure Web Sites. Eelco Koster Software architect ORDINA Onder de motorkap van Microsoft Azure Web Sites Eelco Koster Software architect ORDINA Agenda Introductie Architectuur Project Kudu Azure Resource Manager Doel Dieper inzicht geven in de werking van Azure

Nadere informatie

Planbord installatie instructies

Planbord installatie instructies Planbord installatie instructies Uit Comprise Wiki Inhoud 1 Basis installatie 1.1 Installeren 1.1.1 Microsoft Data Access Components 1.2 De eerste keer starten 2 Veelgestelde vragen 2.1 "Network resource

Nadere informatie

Workflows voor SharePoint met forms en data K2 VOOR SHAREPOINT

Workflows voor SharePoint met forms en data K2 VOOR SHAREPOINT Slimmer samenwerken met SharePoint Workflows voor SharePoint met forms en data K2 VOOR SHAREPOINT Workflows, forms, reports en data WAAROM KIEZEN VOOR K2? Of u nu workflows moet maken voor items in SharePoint

Nadere informatie

dro - DSI Info voor software leveranciers

dro - DSI Info voor software leveranciers dro - DSI Info voor software leveranciers Wim De Smet Overleg SW-leveranciers 15-01-2015 1 Architectuur Service Oriented Architecture Services onderdeel van het platform Clients in gebruikerstoepassing

Nadere informatie

Gebruik van cryptografie voor veilige jquery/rest webapplicaties. Frans van Buul Inter Access

Gebruik van cryptografie voor veilige jquery/rest webapplicaties. Frans van Buul Inter Access Gebruik van cryptografie voor veilige jquery/rest webapplicaties Frans van Buul Inter Access 1 Frans van Buul frans.van.buul@interaccess.nl 2 De Uitdaging Rijke en veilige webapplicaties Een onveilig en

Nadere informatie

XML. Alle tekortkomingen op een rijtje! (en een paar pluspunten...) Marc de Graauw http://www.marcdegraauw.com/

XML. Alle tekortkomingen op een rijtje! (en een paar pluspunten...) Marc de Graauw http://www.marcdegraauw.com/ XML Alle tekortkomingen op een rijtje! (en een paar pluspunten...) De geschiedenis van XML SGML Standard Generalized Markup Language IBM: back to the sixties... Markup: structuur, niet processing HTML:

Nadere informatie

ASRemote WebService. Via deze webservice kunt u:

ASRemote WebService. Via deze webservice kunt u: ASRemote WebService De ASRemote WebService is een SOAP Webservice die softwarematige communicatie met Exact Globe mogelijk maakt vanaf een willekeurige locatie op het internet. Via deze webservice kunt

Nadere informatie

Beschrijving functioneel en technisch design van de website

Beschrijving functioneel en technisch design van de website Bespreking Punten: Beschrijving functioneel en technisch design van de website Nr. Punt 1 Student 2 Bedrijf 3 Algemene lay out 4 Technologieën 5 Webruimte en datatrafiek 1. Student Registratie Bij de registratie

Nadere informatie

NHibernate als ORM oplossing

NHibernate als ORM oplossing NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een

Nadere informatie

Tips & Tricks: Tip van de maand November 2010. Office Integratie

Tips & Tricks: Tip van de maand November 2010. Office Integratie Tips & Tricks: Tip van de maand November 2010 Door: Martijn Janssen Introductie Office Integratie De Teamcenter MS Office-integratie maakt gebruik van Microsoft Office 2003 of 2007 in een beheerde Teamcenter

Nadere informatie

Installatie en configuratie documentatie

Installatie en configuratie documentatie Installatie en configuratie documentatie Assistance Web Portal v. 2.58, 2.60 Voor Windows 2003 / 2008 / XP / Vista / Windows 7 Assistance PSO handleiding, uitgegeven door Assistance Software. Alle rechten

Nadere informatie

Remote Back-up Personal

Remote Back-up Personal handleiding Remote Back-up Personal Versie 4 1 INLEIDING... 3 1.1 SYSTEEMEISEN... 3 1.2 BELANGRIJKSTE FUNCTIES... 3 2 INSTALLATIE BACK-UP MANAGER... 4 2.1 VOLLEDIGE DATA BESCHIKBAARHEID IN 3 STAPPEN...

Nadere informatie

Vincent. Hierbij het profiel van.net developer Vincent uit Delft. Vincent presenteert zichzelf graag door onderstaande drie vragen te beantwoorden:

Vincent. Hierbij het profiel van.net developer Vincent uit Delft. Vincent presenteert zichzelf graag door onderstaande drie vragen te beantwoorden: Contact the Agency Laurens Simonse 06 22801031 laurens@rockstars-it.nl Bart Nijskens 06 52302211 bart@rockstars-it.nl Vincent Hierbij het profiel van.net developer Vincent uit Delft. Vincent presenteert

Nadere informatie

DE ELEKTRONISCHE IDENTITEITSKAART (EID)

DE ELEKTRONISCHE IDENTITEITSKAART (EID) DE ELEKTRONISCHE IDENTITEITSKAART (EID) MS OFFICE OUTLOOK 2007 (WINDOWS) VERSIE 1.1.1 NL Disclaimer Fedict is niet verantwoordelijk voor om het even welke schade die een derde zou ondervinden ingevolge

Nadere informatie

Business-to-Business

Business-to-Business Business-to-Business 1 WAT IS BUSINESS-TO-BUSINESS? 1.1 Inleiding Bedrijven communiceren veelvuldig met elkaar. Orders worden geplaatst, facturen worden verzonden, informatie wordt uitgewisseld. Zo n dertig

Nadere informatie

Beschrijving Remote Access functionaliteit RWS DELTAMODEL

Beschrijving Remote Access functionaliteit RWS DELTAMODEL Beschrijving Remote Access functionaliteit RWS DELTAMODEL Versie 1.0 Oktober 2012 Frits van de Peppel (KNMI) Pagina 1 van 5 Inleiding Dit document beschrijft de te nemen stappen en beperkingen die van

Nadere informatie

Perceptive Process. Technische Specificaties. Version: 3.5.x

Perceptive Process. Technische Specificaties. Version: 3.5.x Perceptive Process Technische s Version: 3.5.x Written by: Product Knowledge, R&D Date: December 2015 2015 Lexmark International Technology, S.A. All rights reserved. Lexmark is a trademark of Lexmark

Nadere informatie

HBO5 Informatica Netwerkbeheer (90 studiepunten) In deze module leer je projecten op te stellen en te programmeren in de VB.NET-omgeving.

HBO5 Informatica Netwerkbeheer (90 studiepunten) In deze module leer je projecten op te stellen en te programmeren in de VB.NET-omgeving. STUDIEFICHE CVO DE AVONDSCHOOL Opleiding HBO5 Informatica Netwerkbeheer (90 studiepunten) Module A5 Programmeren 1 (9 studiepunten) Plaats van de module in de opleiding: In deze module leer je projecten

Nadere informatie

Technisch Ontwerp One Fox edav

Technisch Ontwerp One Fox edav Technisch ontwerp van de One Fox edav module Kenmerk: TO_EDAV_MVDB_51 Document: V1,2 / TO edav v2.2 Status: Publicatie: Definitief 28-2-2013 Documenthistorie Wanneer Versie Wie Wat en waarom 25-02-2010

Nadere informatie

Nederlands WMS - SLD Profiel. Versie 1.0

Nederlands WMS - SLD Profiel. Versie 1.0 Nederlands WMS - SLD Profiel Versie 1.0 Ravi: een profiel Ravi, netwerk voor geo-informatie Stichting Ravi is een netwerkorganisatie in het publieke domein en richt zich op de ruimtelijke ontwikkeling

Nadere informatie

Vakgroep CW KAHO Sint-Lieven

Vakgroep CW KAHO Sint-Lieven Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be

Nadere informatie

Zelftest XML Concepten

Zelftest XML Concepten Zelftest XML Concepten Document: n1035test.fm 18/02/2010 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING Om een idee te hebben van wat we verwachten als voorkennis

Nadere informatie

Aquo Domeintabellen Services (Aquo DS) Handleiding Webservice

Aquo Domeintabellen Services (Aquo DS) Handleiding Webservice Aquo Domeintabellen Services (Aquo DS) Handleiding Webservice handleiding voor de programmeur Auteur: Informatiehuis Water Documentbeheer Wijzigingshistorie Datum Versie Auteur Wijziging Aat van den Heuvel

Nadere informatie

Documentatie. Remote Access Voorziening Etam (RAVE)

Documentatie. Remote Access Voorziening Etam (RAVE) Documentatie Remote Access Voorziening Etam (RAVE) Versie 1.5 Datum: 16 april 2009 1. INLEIDING 3 2. ÉÉNMALIGE INSTALLATIE CITRIX WEB CLIENT 4 3. VERBINDING MAKEN MET HOOFDKANTOOR 9 3.1 Starten RAVE 10

Nadere informatie

Dynamiek met VO-Script

Dynamiek met VO-Script Dynamiek met VO-Script Door Bert Dingemans DLA Ontwerp & Software bert@dla-architect.nl Inleiding Op de SDGN nieuwsgroep voor Visual Objects ontstond laatst een draad van berichten over de nieuwe libraries

Nadere informatie