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:

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:

SnagIt   

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