na cosa che sicuramente sarà accaduta a molti è quella di avere un pò di confusione sui termini Data Service, Domain Service, RIA Service e così via. C'è un bellissimo articolo di Riccardo Di Nuzzo che è davvero illuminante per diramare i notevoli dubbi che inevitabilmente sorgono confrontando i vari termini citati sopra. Innanzitutto quello che verrà illustrato in questo post sarà la possibilità di consumare un Data Service OData tramite un client Windows Phone 7. Partiamo creando un nuovo Sito Web con posizione su localhost (importante che sia su localhost per il motivo che vedremo avanti). Nell'esempio si è usata la locazione C:\inetpub\wwwroot\NWDataService e il servizio lo abbiamo chiamato NWDataService.svc. Togliamo dal sito web tutti i file prettamente Web (lasciando solo il web config, ilglobal.asax, la cartella App_Code e la cartella App_Data. Aggiungiamo quindi un nuovo modello dati che chaimeremo NorthWind.edmx (diamo per scontato che un Northwind DB c'è sicuramente sulle macchine di tutti gli sviluppatori altrimenti è semplicissimo procurarselo). Ai fini di questo progetto abbiamo inserito solo la tabella Employees. Per completare il tutto aggiungiamo un WCF DataService e come modello di Entities da assegnare scegliamo ovviamente il nostro NorthWind.edmx. Il progetto Web dovrebbe apparire così:

Per provare se il servizio funziona, di solito si fa click con il tasto destro sul file .svc e si sceglie 'view in browser'. Questo farà partire immediatamente la richiesta al server che ci ritornerà un 'riassunto' delle entities che potremo interrogare.

Infatti i dataservices pubblicano delle entità che è possibile interrogare tramite il protocollo OData. Quest'ultimo è un formalismo divenuto oramai uno standard molto utilizzato che permette di inviare delle query al servizio WCF che espone delle entities. Alcuni esempi di query Odata possono essere consultate nel sito ufficiale.
WCF Data Service Client
Adesso andiamo a costruire il progetto Silverlight Windows Phone che dovrà consumare il servizio appena implementato. Appena aperto il progetto la prima cosa che viene da fare è quella di fare un bel 'add service reference', ma a quel punto andremmo incontro ad una delusione in quanto tale reference non è supportata da Windows Phone. La riprova la abbiamo utilizzando Fiddler, lo sniffer Http che in questo post abbiamo imparato ad utilizzare con l'emulatore di Windows Phone 7. Dopo aver mandato in esecuzione Fiddler effettuiamo la richiesta della risorsa svc e notiamo quanto accade:

Esatto il file non può essere consumato in maniera nativa da WP7. Se andiamo a vedere il tracciato di Fiddler notiamo come la richiesta Http avvenga correttamente, così come la risposta del server sia ineccepibile. Il problema è proprio la compatibilità di OData con WP7.

Fortunatamente è possibile però arrivare al risultato che ci aspettiamo sfruttando una libreria, che è possibile scaricare da qui
ODataLibrary_WinPhone7_CTP.rar (343,38 kb)
Scompattate la libreria e memorizzatevi la directory dove andrete a mettere l'assembly che ci interessa chiamato System.Data.Services.Client.dll di cui dobbiamo aggiungere un riferimento nel nostro progetto WP7. Dopo aver fatto l'add reference della libreria client dobbiamo costruirci quelle classi che rappresentano il client vero e proprio relativo al servizio svc. Dobbiamo cioè costruire quelle classi che sul lato client invocheranno (tramite le classi presenti in System.Data.Services.Client) le corrette query OData e saranno in grado di ricostruire sul dispositivo le collections di oggetti relativi alle response ricevute. Per fare questo dobbiamo posizionarci sulla directory C:\Windows\Microsoft.NET\Framework\v4.0.30319 (se il vostro S.O è in C:\Windows altrimenti inserite la vostra SystemRoot directory). Digitare quindi il seguente comando:
DataSvcutil.exe /uri:http://localhost/NWDataService/NWDataService.svc/ /DataServiceCollection /Version:2.0 /out:C:\Users\sandro\Documents\ClientCode\NWClient.cs
Indicate ovviamente la directory di out dove memorizzare gli 'artifacts' di tipo client. Copiate il file NWCliwnt.cs fisicamente nella directory del progetto e aggiungetelo come 'exsting item'. A questo punto il più è fatto, non rimane che costruire il servizio-client che metteremo dentro una classe NorthWindService. La classe NorthWindService ha un metodo, QueryEmployees, il quale crea prima di tutto un 'context' a partire da una Uri che punta al nostro file svc. L'indirizzo localhost lo abbiamo sostituito con quello riconosciuto da Fiddler così da poterlo catturare successivamente.

Il risultato viene consumato nella callback. Possiamo vedere il traffico che è passato tra l'emulatore e localhost e notiamo che è la stessa richiesta fatta in precedenza, solo che stavolta, tramite la libreria utilizzata, siamo riusciti a consumare la risposta pervenutaci dal service.

Da notare solamente due cose. La prima, come indicato dalla freccia, la richiesta Http è stata inoltrata a 127.0.0.1 e la seconda è che il client ha interrogato il server secondo protocollo OData, chiedendo Atom e ottenendo esattamente questo come si vede anche dalla risposta data dal server.
Soprattutto...enjoy the code:
SV_Blog.rar (938,53 kb)