Windows Communication Foundation (WCF) ... qualche web-pillola
Sì, spero di fare cosa gradita iniziando una serire di "web-pillole" su quest' argomento. Nel post trovate riferimenti alle pagine della documentazione ufficiale, dove trovare approfondimenti. Iniziamo con la prima e fatemi sapere se volete che ne scriva altre sull'argomento.
Windows Communication Foundation, WCF per gli amici, è una delle novità introdotte da .NET Framework 3.0, rilasciato con Windows Vista. Come penso sapete le altre componenti del .NET Framework 3.0 sono Windows Presentation Foundation (WPF), Windows Workflow Foundation (WF) e Windows CardSpace (WCS). Il runtime del .NET Framework 3.0 è anche disponibile per Windows XP SP2 e Windows 2003 SP1 .
Quindi in estrema sintesi .NET 3.0 = WCF + WF + WPF + WCS. Se volete qualche informazione in più potete scaricare qualcuna delle mie vecchie presentazioni qui.
WCF è nato con almeno i seguenti obiettivi:
- Offrire un modello di programmazione che sia in linea con le moderne architetture SOA (Service Oriented Architecture)
- Offrire il supporto a tutti gli standard WS-*, cioè a quelle specifiche nate con l' avvento dei Web Services e che hanno come scopo ultimo favorire l'interoperabilità tra piattaforme diverse. Per saperne di più sui WS e sulle specifiche ad essi correlati...
- Unificare il modello di programmazione per le diverse tecnologie Microsoft.
Soffermiamoci sull'ultimo punto: fino a prima di WCF, eravamo abituati a usare diversi modi di programmare, per modi intendo API e modelli di programmazione: diverso è se dobbiamo creare un'applicazione che usa .NET Remoting, Web Services, Enterprice Services, COM+ o MSMQ; questo per diverse ragioni: basti pensare che molte di queste tecnologie sono nate in momenti storici diversi. Con WCF possiamo usare un unico modello di programmazione quello di WCF e utilizzare tutti i paradigmi di programmazione prima menzionati. Tanto per fare un esempio pensiamo di scrivere con WCF un servizio, che implementa semplici funzionalità di somma, sottrazione etc. Vedremo meglio tra breve, cosa si intende per servizio, e di "esporlo" come un Web Service via http. La cosa interessante di WCF e del suo modello di programmazione e che fatto tale servizio, cambiando semplicemente i file di configurazione del client e del server, potremmo ad esempio esporre il nostro servizio,via HTTP come Web Service, ma anche via TCP/IP. In uno scenario in cui vogliamo usare i Web Service per offrire interoperabilità tra piattaforme diverse, magari esterne alla nostra azienda, e offrire al tempo stesso maggiori performance ai client che sono interni al nostro dominio aziendale WCF è sicuramente di aiuto. Con WCF il nostro servizio, sarà implementato una volta, ma il "contenitore" del servizio, lo esporrà usando due distinti trasporti. Attenzione ho detto contenitore, non ho parlato solo di IIS, ma ritornerò presto su questo.
Quindi usiamo WCF per realizzare applicazioni distribuite, usando un paradigma di programmazione serviced-oriented.
Ok, capito questo, vediamo come addentrarci in WCF, introducendo i concetti di EndPoint, Address, Binding e Contract. Farò riferimento, anche in seguito, agli esempi che trovate nell' SDK di Windows, che sono scaricabili anche separatamente come samples per WCF e WCS qui.
In generale abbiamo un Client ed un Server, che comunicano usando dei messaggi: ricordate si parlava di architetture SOA … per fissare le idee, inizialmente, ma solo inizialmente, pensate a quello che sappiamo dal mondo dei Web Service.
L'Host, cioè chi contiene il nostro servizio (e.g. libreria matematica che espone funzioni base ), lo espone attraverso quello che viene definito come Endpoint . Endpoint = Address+Binding+ Contract (detti l'ABC di WCF!). E il client ? Anche quest'ultimo parlerà con il servizio in questione usando lo stesso Endponit. In breve:
- Contract: interfaccia del servizio che vogliamo rendere fruibile. (Cosa posso fare?)
- Binding: è fatto da più elementi, detti binding elements, che rappresentano il tipo di trasporto utilizzato, ad esempio TCP/IP, più altre funzionalità più specifiche che riguardano ad esempio la sicurezza, la possibilità di supportare una sessione condivisa tra client e server o il sistema di codifica utilizzato. (Come comunicare con il servizio?)
- Address: è l'indirizzo, condiviso tra client e server per la comunicazione, specificato usando un URI, che identifica anche il trasporto usato. Ad esempio https://cohowinery:8005/ServiceModelSamples/CalculatorService. (Dove posso trovare il servizio ?)
Nell'immagine seguente è espressa una vista di insieme, spero chiara:
Aggiungo un'importantissima considerazione: il contenitore del servizio, come l'ho definito fin'ora, l' host può essere non solo IIS, ma anche una console application, una Windows Form, un pacchetto COM+, un'applicazione WPF etc.
Nella figura il nostro servizio espone l'interfaccia ICalc che viene utilizzata per definire il contratto, tale contratto è utilizzato per definire due Endpoint, uno che usa un binding che internamente usa come trasporto TCP/IP e un secondo che usa come trasporto HTTP e che permette di esporre il servizio come Web Service. In entrambi i casi sono definiti due Address distinti che devono essere conosciuti dai client. I client infatti usano WCF e usano i due distinti endpoint. Il client che consuma il servizio esposto come Web Service potrebbe essere anche un client non-WCF, ad esempio un'applicazione Java su altra piattaforma.
Nel prossimo post vedremo un esempio di codice sia di un client che un servizio.
A questo link trovate il sito community sul .NET 3.0 e in particolare su WCF: trovate esempi, blog, etc. Interessante la sezione resources con articoli interessati.
Buona lettura e fatemi sapere ..
-Pietro
Comments
Anonymous
October 10, 2007
Oggi ho partecipato all’ Innovation Day , una giornata dedicata ai nostri Partner sulle novità tecnologicheAnonymous
October 26, 2007
Eccomi, ho appena finito le mie sessioni alla WPC Un rapido riassunto e un po' di materiale. Nella sessioneAnonymous
January 05, 2008
Grazie, sei stato chiarissimo, ti disturberò per qualche suggerimento e ulteriore chiarimento....Anonymous
July 23, 2008
Ciao, mi dispiace disturbarti ma vorrei chiederti un chiarimento sull'interoperabilità tra servizi WCF e client non-WCF. Nel mio caso il client gira sotto Linux, scritto in C++, e dovrebbe utilizzare SOAP per comunicare con la mia WCF. Ho provato a far generare i file wsdl e xsd al programma svcutil ma, compilandoli poi con l'utility wsdl2h di gSOAP pare che non siano compatibili. Hai qualche idea in merito? GrazieAnonymous
July 23, 2008
Ciao Federica, penso che poresti usare come binding WCFil basichttp, che supporta WS-BasicProfile 1.1, che dovrebbe essere suppotto un po' da tutti. Mandami magari una mail, dato che può essere lunga la spiegazione. Da questo blog, in alto a sinistra clicca su email.