For at imødekomme løs kobling mellem service klient og service host, er der mulighed for at introducere et yderligere abstraktionslag mellem parterne. Dette abstraktionslag udgør en ny facade ud mod de service konsumerende klienter. Microsoft's Managed Services Engine (MSE) bygger ovenpå WCF, og sørger for virtualisering og versionering af services. MSE imødekommer problemstillingen med 'dll hell' på service niveau, da MSE sørger for, operationer på services får versions numre, så fremtidige versioner af samme service kan eksistere side-om-side med de tidligere versioner. Dette forebygger klienter, der konsumerer ældre services ikke falder om som små domino brikker på grund af en opdatering.

Ydermere sørger MSE for at virtualisere WCF services. Dette betyder, at WCF services fysisk kan køre på helt andre maskiner, hvor MSE abstraherer disse services og udstiller dem på ny. Disse oplysninger gemmer MSE i 'MSE_RESPOSITORY' databasen på en SQL Server (2005 el. 2008). MSE er faktisk uafhængig af teknologi, så længe der findes en wsdl, så kan MSE versionere og virtualisere denne service. MSE er yderligere kompatibelt med diverse service bindings (NetTCP, WsHttp, BasicHttp) samt SOAP versioner, og der findes mange konfigurations muligheder.

Eksempel på virtualisering af en WCF service:
MSE Model Viewer startes op (default view er 'End to End Item Management').
Vælg tools -> Load Resources -> Web Service Metadata. Herefter starter en lille wizard. Lokationen på wsdl fil angives enten som enkeltstående fil eller som en del af service referene -> Next -> Herefter vælges 'Virtualize Service Operations...' -> Next -> Next -> Next -> Close. Herefter vil man kunne se operationer på den virtualiserede service under operations, og man vil ligeledes finde service specifikke egenskaber under 'Rescources', 'Instances' og 'Systems'. Under 'Configuration' / 'bindings' vil man kunne se den importerede binding.

MSE Model Viewer

Nu da en service er registreret i MSE, skal der defineres et 'Endpoint'. Dette gøres ved at højreklikke i 'Endpoints' området -> Vælge 'Add New Item'. Tast det nye navn på service (man kan vælge at beholde samme navn). Herefter klikker man på 'Unrelated' under 'Configuration' / 'Bindings' og trækker man den importerede binding, og slipper den i 'Binding' feltet, og der trykkes herefter på 'Apply'. Herefter skal operationen knyttes til det oprettede 'Endpoint'. Dette gøres ved at klikke op 'Unrelated' fanen under 'Operations' og trække operationen over det nye 'Endpoint' og slippes herefter (over endpoint ikonet).
Nu mangler den indregistrerede service et sted, den kan blive udstillet på, dvs. et sted den skal hostes. Ved installation af MSE er der pr. default oprettet en lokal runtime server. Den kan ses under 'Servers' og hedder 'LocalRS'. Der dobbeltklikkes på LocalRS og under 'Endpoints' aktiveres 'Unrelated' fanen. I denne finder man, det allerede oprettede 'Endpoint' og dette 'Endpoint' trækkes og slippes oventpå LocalRS (server ikon billedet). Der vil starte et lille vindue op, hvor man vil finde versions nummeret og angivelse af om den skal være aktiv. Herefter vil man kunne finde URL'en til den virtualiserede service under 'Endpoint URL'. Test evt. ved at højreklikke på URL'en og vælg 'Browse'. Lad en service konsumer herefter lave en service reference til denne service, og se at alt spiller nøjagtigt på samme måde, som ved en direkte reference til en WCF service.

Umiddelbart er der jo ikke så meget magi ved at virtualisere en service til at starte med. For at bevise den løse kobling og de service orienterede kræfter, kan vi fortsætte ved at ændre WCF servicen. Lad os ændre signaturen på en operation, og se om en service klient stadigvæk kan køre videre, som om intet er sket.

Lav en ændring af en fysisk operation på den relevante service. Når man herefter kører igennem wizarden under Tools -> Load Resources -> etc. Vil du bemærke, at de uberørte operationer ikke vil blive importeret. Sørg for at ændre versions nummeret på operationen til fx. '1.0.0.1'. Hægt den herefter på det allerede oprettede 'EndPoint' og man vil herfter kunne se at en version '1.0.0.0' allerede vil være synlig. Vælg 'published' og 'Active' på den nye operation. Vend tilbage til service klienten og bemærk løsningen kører videre uden problemer. I dette tilfælde var signaturen på operationen ændret, men klienten faldt ikke om af den grund.

Er der problemer med at få opdateret MSE runtime med nyeste opdateringer som fx. nye operationer, hvor WSDL ikke umiddelbart ser opdateret ud. Så kan det hjælpe at genstarte 'MSE Runtime Server' under 'Services'. Start -> Administrative Tools -> Services.

MSE Runtime Server

MSE kommer med et service tester tool, man hurtigt kan teste de virtualiserede services igennem.

MSE test tool

Er der ændringer på eksisterende skemaer effektureres rettelserne på følgende måde.

Åbn Modelviewer -> Tools -> Manage Service Model Components -> Data Entities. Tryk 'Next' og find schemaet under listen. Vælg Complex type og tryk 'Next'. Vælg 'Update Revision References - Check here to update entity...' og tryk 'Next'. Kør Wizarden færdig og genstart 'MSE Catalog Server' og 'MSE Runtime Server' under 'Services'. Start -> Administrative Tools -> Services. Genstart IIS og browse i WSDL filen og se data entiteten er ændret.

Kontakt mig gerne for yderligere spørgsmål.

Managed Services Engine (MSE) er gratis og kan hentes ned fra codeplex her.

Logfilen kan findes her -> C:\Temp\logs\mse_catalog_sb.svclog