Se è solo la pagina 2 te la riposto qui, mentre Alessio e Daniele verificano
La classe data: accesso al file system
Proseguiamo creando un progetto di tipo Class Library nel quale programmeremo la logica del così detto strato di "servizi", attraverso il quale esporremo le immagini per essere visualizzate nell'applicazione. Questo progetto è di tipo Class Library del .NET Framework, poichè sarà utilizzato dall'applicazione web. In realtà, un dettaglio importante che illustreremo in seguito, è che non andremo a creare dei completi web service .NET, ma esporremo le informazioni sulle immagini con strutture XML attraverso normali richieste Http. Tale scelta è dettata dalla semplicità delle funzionalità di cui abbiamo bisogno, e anche dalla facilità con cui è possibile fare il deploy di questo tipo di "servizi", entreremo nel dettaglio nel prossimo paragrafo.
Come abbiamo già detto, recupereremo le immagini direttamente dal file system, quindi procediamo alla creazione della classe "Gallery" con i metodi "GetAlbums" e "GetPictureOfAlbums": entrambi recuperano le informazioni accedendo alle cartelle del sito web e popolano rispettivamente collezioni IList<Album> e IList<Picture>. Analizziamo brevemente il codice di GetAlbums:
Esempio 3 - C#
string baseUrl = System.Configuration.ConfigurationSettings.AppSettings["BaseUrl"].ToString();
string imageFolderName = System.Configuration.ConfigurationSettings.AppSettings["ImageFolder"].ToString();
public IList<Album> GetAlbums()
{
IList<Album> albums = new List<Album>();
string mainGalleryPath = String.Format("{0}/{1}", baseUrl, imageFolderName);
DirectoryInfo dirInfo = new DirectoryInfo(HttpContext.Current.Server.MapPath(imageFolderName));
try
{
DirectoryInfo[] tempAlbums = dirInfo.GetDirectories();
foreach (var item in tempAlbums)
{
Album alb = new Album();
alb.Title = item.Name;
alb.Folder = item.Name;
if (item.GetFiles().Count() > 0)
alb.ImageFileName = String.Format("{0}imageservice.axd?IF={1}/{2}/{3}&H=90", baseUrl, imageFolderName, item.Name, item.GetFiles("*.jpg")[0].Name);
albums.Add(alb);
}
}
catch
{
}
return albums;
}
Abbiamo parametrizzato "baseUrl" e "imageFolderName" in modo che possano essere configurati senza la necessità di ricompilare il codice, queste informazioni saranno definite nel web.config dell'applicazione web. Elaborato il path della cartella e recuperato il corrispondente oggetto DirectoryInfo, il codice esegue un ciclo per ogni cartella che trova al suo interno, popola la collezione tempAlbums con i corrispondenti oggetti Album e, più interessante, valorizza la proprietà "ImageFileName" con il path della prima immagine presente nella cartella. utilizzeremo il valore di questa proprietà per visualizzare una immagine rappresentativa dell'album nell'elenco grafico dell'applicazione. Il metodo GetPicturesOfAlbum è del tutto analogo con la particolarità che costruisce la collezione di oggetti Picture partendo dalla directory specificata come parametro.
Proseguiamo creando due metodi corrispondenti ai precedenti appena creati, responsabili di creare le strutture XML che descrivono i dati: "GetXMLAlbums" e "GetXMLPicturesOfAlbum". Attraverso l'utilizzo di LINQ to XML, essi creano la struttura XML elaborando le corrispondenti collezioni e restituendo il tutto sotto forma di stringa:
Esempio 4 - C#
public string GetXMLAlbums()
{
IList<Album> _albums = this.GetAlbums();
XDocument doc = new XDocument(
new XElement("albums",
from alb in _albums
select new XElement("album",
new XElement("Title", alb.Title),
new XElement("Folder", alb.Folder),
new XElement("ImageFileName", alb.ImageFileName)
)));
return doc.ToString();
}
Come possiamo vedere dal codice, grazie all'aiuto di Linq tale operazione è veramente semplice.
I servizi: esponiamo le immagini con HttpHandler di ASP.NET
Completato lo strato di accesso ai dati, proseguiamo definendo le modalità di esposizione degli XML programmando due HttpHandler nel sito web ASP.NET: Albums.ashx e PicturesOfAlbum.ashx. Anche per coloro che non hanno mai affrontato questo tipo di operazione, grazie alla procedura guidata di Visual Studio è tutto veramente immediato. Un HttpHandler, definito come nuovo tipo di elemento del progetto, è una classe che entra nell'elaborazione da parte dell'engine di ASP.NET in modo analogo ad una pagina aspx, ma senza l'infrastruttura della pagina, che non è necessaria. L'utilità di un HttpHandler è proprio quella di intercettare la richiesta Http e la semplicità con cui possiamo elaborare i dati restituiti. Per le nostre esigenze i due handler saranno richiamati dall'applicazione Silverlight ed esporranno direttamente l'XML, così come visibile nel codice seguente:
Esempio 5 - C#
namespace ASPItalia.WebSiteGallery.Web
{
public class Albums : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/xml";
Gallery _service = new Gallery();
context.Response.Write(_service.GetXMLAlbums());
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Nell'unico metodo ProcessRequest andiamo ad intercettare il contesto della richiesta Http, definiamo il content type di risposta come testo XML e andiamo semplicemente a fare il response dell'XML restituito dal nostro strato dati. Nell'handler PicturesOfAlbum facciamo accesso anche ai parametri in querystring, per recuperare il nome della cartella della quale esporre le relative immagini.