Basandomi su un tutorial di Scott Gu, provo a realizzare una app in SL in grado di interrogare un web service pubblico e poi a visualizzare il risultato in modo carino.

Last.fm e’ la famosa community musicale tramite cui ognuno puo’ crearsi un profilo in base ai propri gusti musicali e interagire con gli altri … bla bla … insomma un perfetto esempio di applicazione web 2.0; tra le altre cose espone le proprie API come web services e utilizzero’ proprio una chiamata al loro web service per visualizzare quelli che sono i miei brani preferiti, invocando il metodo library.gettracks a cui appendo il mio username: http://ws.audioscrobbler.com/2.0/?method=library.gettracks
&api_key=b25b959554ed76058ac220b7b2e0a026&user=cdiscla

Nel mio progetto SL in C# creo una class contenente i campi che voglio prendere dal WS e visualizzare nella mia app SL.

namespace WS_LastFM_SLight
{
public class lastFM
{
public string name { get; set; }
public string url {get;set;}
public string image { get; set; }
public string author { get; set; }
public int playcount { get; set; }
}
}

All’avvio dell’applicazione SL richiamo il Web Service di last.fm:

string sWSUrl = “http://ws.audioscrobbler.com/2.0/?method=library.gettracks&api_key=b25b959554ed76058ac220b7b2e0a026&user=cdiscla”;
WebClient wsFM = new WebClient();
wsFM.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wsFM_DownloadCompleted);
wsFM.DownloadStringAsync(new Uri(sWSUrl));

Nella gestione dell’evento DownloadStringCompletedEventHandler avviene l’intervento di Linq:

private void wsFM_DownloadCompleted(System.Object sender, DownloadStringCompletedEventArgs e)
{
  if(e.Error==null)
  {
    string result=e.Result;
    DisplayTracks(result);
  }
}

private void DisplayTracks(string sTracks)
{
  XDocument xmlTracks = XDocument.Parse(sTracks);
  //
  var t = from track in xmlTracks.Descendants("track")
    where track.Element("image")!=null &&
                 track.Element("image").Attribute("size").Value.Equals("small")
    select new lastFM
    {
      name=((string)track.Element("name").Value).Trim(),
      url = ((string)track.Element("url").Value).Trim(),
      image = ((string)track.Element("image").Value),
      playcount= (Convert.ToInt16(track.Element("playcount").Value)),
      author=((string)track.Element("artist").Element("name").Value)
    };
    lastFMGrid.ItemsSource = t;
}

Il risultato puo’ essere visualizzato qui

I sorgenti, invece, sono qui.

Il fatto e’ che il tutto non e’ propriamente bello da vedere, nel prossimo articolo su SL cerchero’ di aggiustarlo esteticamente.