Windows Phone: aggiungere una reference ad un servizio WCF
Posted by qmatteoq in Windows Phone Devs on Friday 18 June 2010 at 9:04 PM
Breve post un po’ tecnico per soli “developers”: tranquilli, a breve torneranno anche i post più “easy” sul mondo mobile in generale :)
Se avete seguito un po’ i miei post su Windows Phone dell’ultimo periodo, saprete che la possibilità di consumare servizi WCF è uno degli aspetti più importanti della piattaforma, dato che allo stato attuale non è possibile gestire database in locale. Una soluzione a questo problema, se non si vuole usare l’isolated storage, è quindi quella di posizionare i database su un server in remoto e di leggere / scrivere dati su di essi dall’applicazione mobile tramite dei servizi.
Questo aspetto è fondamentale anche in Silverlight nella sua versione “tradizionale”: dato che le applicazioni girano lato client, non è possibile collegarsi direttamente ad un database (dato che è una operazione che viene fatta lato server), ma si deve passare tramite dei servizi. E’ anche per questo motivo che Microsoft ha introdotto WCF (Windows Communication Foundation), una specie di evoluzione dei web service, che permette di realizzare servizi che possono poi essere consumati da applicazioni web, desktop e mobile.
Se come me per sviluppare su Windows Phone non usate la versione Express contenuta nel toolkit, ma la versione completa (nel mio caso, la Ultimate) e cercate di aggiungere una reference ad un servizio nel vostro progetto scoprirete un’amara sorpresa.
Come potete vedere dall’immagine a lato, la voce Add service reference (che serve proprio per aggiungere la reference ad un servizio WCF all’interno della nostra applicazione) non c’è!
Non si tratta di un limite di Windows Phone, ma di una non ancora perfetta integrazione tra i tool di sviluppo per Windows Phone e Visual Studio 2010. La soluzione è quella di aprire il vostro progetto con la versione Express di Visual Studio: facendo così, la voce Add Service Reference comparirà come per magia :) Certo, di contro probabilmente all’apertura del progetto vi verranno mostri diversi errori, nel caso (non comune) che la vostra soluzione contenga altri progetti non di tipo Windows Phone e quindi non apribili dalla versione di Visual Studio installata con i tool (nell’immagine di esempio, la mia soluzione contiene sia un’applicazione Windows Phone che il servizio WCF che deve consumare).
Tale “bug” (se così possiamo chiamarlo) vi costringerà inoltre a fare il deploy del vostro servizio WCF su un server web (anche locale): Visual Studio, nella schermata di aggiunta di una service reference, offre infatti la possibilità di effettuare l’auto discovery per cercare eventuali servizi WCF facenti parte della soluzione. Il problema è che Visual Studio Express for Windows Phone, non essendo in grado di aprire il progetto del servizio WCF, non riuscirà a trovarlo: tale funzionalità diventa quindi totalmente inutile.
Se come me volete fare il deploy del servizio in locale e avete installato IIS dopo che avete installato Visual Studio 2010 (e di conseguenza il framework 4), allora i servizi WCF non funzioneranno. Questo perchè il setup, oltre ad installare le varie applicazioni, va a registrare in IIS le estensioni di ASP.NET e di WCF: ovviamente tutto ciò funziona solamente se IIS è già installato durante il setup di Visual Studio.
Verificare se questo è il vostro caso è molto semplice: una volta effettuato il deploy del servizio sul vostro server Web, provate a richiamarlo direttamente dal browser con il percorso completo (ad esempio http://localhost/Service/Service1.svc). Se le estensioni non sono state installate correttamente, vi verrà restituito un errore del tipo:
HTTP Error 500.21 - Internal Server Error
Handler "svc-Integrated" has a bad module "ManagedPipelineHandler" in its module list"
Per risolvere il problema ed installare le estensioni, sono due le operazioni da fare:
- Andare, dal Pannello di Controllo di Windows 7, nella sezione Program and features (per intenderci, quella dove vengono elencate tutte le applicazioni installate e da dove è possibile rimuoverle) e scegliere l’opzione Turn Windows features on or off: da qui, espandete la voce Microsoft .NET Framework 3.5.1, e mettete un segno di spunta sulle due opzioni Windows Communication Foundation HTTP Activation e Windows Communication Foundation Non-HTTP Activation. Ora premete Ok e aspettate che Windows completi l’installazione.
- Aprite il prompt dei comandi (cmd.exe) con permessi amministrativi e posizionatevi nella cartella del framework (nel caso del frawework 4, il percorso è C:\Windows\Microsoft.NET\Framework\v4.0.30319) e digitate il comando aspnet_regiis.exe –i.
Un ultimo dettaglio: se utilizzate la funzione di pubblicazione di Visual Studio (tasto destro sul progetto, Publish), ci penserà Visual Studio a copiare tutti i file necessari nella cartella di IIS e a creare un nuovo sito o virtual directory. Attenzione che, di default, verrà assegnata all’applicazione come application pool il DefaultAppPool, basato sul framework 2.0. Se avete sviluppato il servizio con una versione diversa del framework (nel mio caso, la 4), dovrete creare un nuovo application pool impostato per usare la versione desiderata e associarlo all’applicazione in IIS.
Il gioco è fatto: ora se provate a richiamare nel vostro browser l’indirizzo completo del vostro servizio dovrebbe apparire una schermata informativa su come generare una classe .NET a partire dal servizio, come nell’immagine.
A questo punto da Visual Studio Express for Windows Phone scegliendo Add Service Reference e digitando l’URL completo del vostro servizio, ci penserà Visual Studio a generare in automatico tutte le classi necessarie per utilizzare il servizio all’interno della vostra applicazione. Come poi interfacciarsi effettivamente con i vari metodi offerti da un servizio WCF all’interno di una applicazione Windows Phone.. beh, lo vedremo un’altra volta!

#1 da http://qmatteoq.tostring.it/blog/post/windows-phone-aggiungere-una-reference-ad-un-servizio-wcf
Windows Phone 7 Recap - Giugno 2010