WCF-tjenestegjennomføring

Da jeg bestemte meg for å opprette en Windows Communication Foundation (WCF) Datatjeneste, var målet å ta et eksisterende klassebibliotek og eksponere en del av funksjonaliteten som en handling. Mitt største problem med denne prosessen var at. NET-klassebiblioteker er fokusert på å tilby objekter som tilfeldigvis har noen metoder, men WCF-tjenester er fokusert på metodene. Denne inversjonen av arkitektur kan gi noen utfordringer. Heldigvis har jeg en tung bakgrunn i ikke-objektorienterte (OO) språk, og jeg skriver ofte objektene mine for å være fokusert rundt en eller to metoder, som det var tilfelle her. Dette jevnet overgangen til WCF kraftig.

Et sammendrag av utført arbeid

I det originale biblioteket ble et primært objekt brukt (med flere støtteobjekter som skal brukes som datastrukturer for egenskaper). Når nok av egenskapene (noen valgfrie) hadde verdier i seg, kan en utførelsesmetode kalles. Dette var ikke bra eller "riktig" OO-design, men OO-arkitekturen er virkelig dårlig i perioder hvor alt du virkelig ønsker er en funksjon med mange parametere (noen valgfrie).

Da jeg gikk til WCF, ønsket jeg å kunne eksponere denne metoden og gi en datastruktur som i hovedsak innkapslet alle egenskapene. Med andre ord gikk jeg fra å ha en datastruktur med en metode som brukte egenskapene til objektet til en metode som godtok alle disse egenskapene som en datastruktur. I begge tilfeller fikk jeg tilbake en datastruktur som representerte en liste over resultatobjekter.

Det første trinnet var å legge til et WCF-serviceprosjekt til løsningen min. Dette skapte en stub-tjeneste for meg. Stubbtjenesten inneholdt en grensesnittfil, en tjenestefil (.svc) og en Web.config-fil. Jeg ga nytt navn til grensesnittet og tjenestefilene for å samsvare med tjenestenavnet mitt, og åpnet deretter filene og gjorde det samme for tjenesten og klassen som ble definert. I likhet med ASP.NET har tjenestefilen en kode bak filen, som er det jeg egentlig skulle jobbe med.

Koden bak og grensesnittet har en grunnleggende implementering, men den var ikke nyttig for meg (den tjener imidlertid som et praktisk referansepunkt hvis du ikke er kjent med dette arbeidet). Stedet å starte er i grensesnittet. Det er ikke obligatorisk å bruke et grensesnitt, men det er nyttig i visse scenarier av arkitekturhensyn, for eksempel når du bruker WCF-tjenesten direkte fra et annet .NET-program.

I grensesnittet (som skulle være dekorert med ServiceContract), opprettet jeg datastrukturer som jeg ville trenge for parametere og utdataverdier som WCF Data Contracts. For å gjøre dette, opprettet jeg klasser og pyntet det med DataContract. Innenfor klassen implementerte jeg egenskapene. Egenskapene, som skal eksponeres via WCF, skal være dekorert med DataMember. Noe å huske på er at når du går på treet, må alle bladnodene være primitive typer. Jeg valgte å ikke bekymre meg for datavalidering på WCF-nivå, først og fremst fordi jeg ville være den eneste personen som bruker denne tjenesten. Når datastrukturene var fullstendige, definerte jeg i grensesnittet en metode (dekorert med OperationContract) som representerte funksjonaliteten jeg ønsket å eksponere. Deretter fjernet jeg standardelementene som veiviseren for legg til prosjekt opprettet.

Figur A

Standard implementering av grensesnitt. (Klikk på bildet for å forstørre.)
Figur B

En bedre titt på koden i standardgrensesnittet. (Klikk på bildet for å forstørre.)

Deretter gikk jeg inn på servicekoden bak filen for å implementere grensesnittet. Dette handler rett og slett om å lage metoder som implementerer grensesnittets metoder og utfører selve arbeidet. Jeg måtte bare lage et objekt fra klassebiblioteket mitt og sette dets egenskaper til verdiene fra inngangsparameteren. Når jeg hadde satt disse egenskapene, ringte jeg utførelsesmetoden og fanget resultatene. Jeg opprettet et objekt av metodens returtype og befolket verdiene fra de fangede resultatene. Deretter ble objektet returnert til klienten.

Figur C

Standard servicekode bak. (Klikk på bildet for å forstørre.)
Figur D

En bedre titt på koden i standardtjenestekoden bak. (Klikk på bildet for å forstørre.)

Når du kjører prosjektet, vil den starte en lokal webserver i Visual Studio og binde den til en tilfeldig port, som å jobbe med et ASP.NET-prosjekt. For å teste tjenesten brukte jeg WCF Test Client-applikasjonen, som skulle åpne automatisk når du kjører prosjektet; Hvis den ikke åpnes automatisk, kan du se etter WcfTestClient.exe i IDE-katalogen i Visual Studio-installasjonskatalogen. Testklienten lar deg ringe mot en WCF-tjeneste og inspisere resultatene. Ved å kombinere dette med de vanlige brytepunktene, klokkene, etc., kan du utføre feilsøkingen din som alle andre applikasjoner.

Figur E

WCF Testklient. (Klikk på bildet for å forstørre.)

Jeg distribuerte til IIS, så det var ikke nødvendig å skrive kode for å starte tjenesten, åpne forbindelser osv. Jeg kunne ha definert ytterligere sluttpunkter i Web.config, men standardverdiene fungerte fint for meg. For å gjøre det enklere, kjører du WCF Service Configuration Editor (det er i Verktøy-menyen) en gang, og det vil fungere som et kontekstmenyelement i Solution Explorer.

Figur F

WCF Service Configuration Editor. (Klikk på bildet for å forstørre.)

Å distribuere er et blunk. Jeg installerte Web Deployment-komponentene på serveren min, høyreklikk prosjektet på i Solution Explorer og valgte Publiser. Å fylle ut veiviseren er ganske åpenbart. Det er flere innstillinger i prosjektets egenskaper for å gi mer kontroll over publiseringen.

Figur G

Guiden for tjenestepublisering. (Klikk på bildet for å forstørre.)

Konklusjon

Det var mye lettere å lage WCF-tjenesten min enn jeg forventet. Selv om jeg ikke gikk veldig dypt inn i WCFs funksjoner, som sikkerhet og autentisering, tror jeg ikke at de fleste utviklere trenger disse elementene (skjønt, fra det jeg har sett, er ikke mulighetene spesielt vanskelig å implementere).

Hvis du har holdt igjen på å tilby funksjonalitet som en webtjeneste fordi det så komplisert ut eller var forvirret om hvordan du gjør det, er det på tide å rulle opp ermene og komme i gang.

J.Ja

© Copyright 2021 | pepebotifarra.com