DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

Sviluppo su Windows RSS Platform

Da poco mi sto occupando dello sviluppo su Windows RSS Platform, il set di API COM (installate insieme a IE7) che forniscono interessanti funzionalità per gestire feed RSS o Atom. Molti hanno già sperimentato questa tecnologia tramite il feed reader di Outlook 2007 piuttosto che tramite l'ormai famoso progetto UniveRSS, un feed reader 3D per Vista. Ebbene, ho subito notato che ci sono diversi vantaggi derivanti dall'utilizzo di questo framework.. ne cito subito tre:

  • Accesso semplificato (direi banale) ai feed items
  • Predisposizione di tutti gli strumenti base per lo sviluppo di un feed reader/aggregator 
  • Presenza di un Engine affidabile e configurabile

Iniziare a lavorare su Windows RSS Platform è veramente semplice: basta referenziare il componente COM "Microsoft Feeds" (%WINDOWS%/system32/msfeeds.dll) all'interno del nostro progetto .NET e il gioco è fatto!
Per quanto riguarda l'object model, invece, le classi che conviene comprendere sin da subito per coprire circa il 90% delle esigenze di sviluppo sono le seguenti:

  • IFeedsManager: gestisce i feeds e la loro organizzazione in cartelle.  
  • IFeedFolder: rapresentazione e gestione di una cartella. E' fondamentale il matching uno-a-uno tra un IFeedFolder ed una entry nel repository dei feed di IE7 su file system
  • IFeed: rappresentazione di un flusso RSS o Atom (sono supportati RSS 0.91, 1.0, 1.1, 2.0, Atom 0.3 e 1.0)
  • IFeedItem: ogni IFeed contiene una collection di IFeedItem ed espone un set di proprietà (la maggior parte in sola lettura) per accedere agli elementi RSS 2.0 
  • IFeedEnclosure: rappresentazione di un file allegato ad un FeedItem (il cui download è disabilitato di default), scaricabile separatamente. 

Ma la vera potenza di Windows RSS Platform è il Feed Download Engine (FDE): questo componente infatti si occupa della sincronizzazione dei FeedItem senza che lo sviluppatore si danni ad architettare mirabolanti algoritmi di scheduling. Ma non finisce qui: FDE è configurabile per rispondere ai requisiti di compatibilità in funzione delle risorse computazionali e di banda disponibili sul client. In effetti, il funzionamento di FDE si basa su una formula, elaborata dal Team di Windows RSS Platform (http://msdn2.microsoft.com/en-us/library/ms686420.aspx) , che in qualche modo garantisce che la sincronizzazione di ogni feed gestito avvenga "al momento giusto":

TS = LastDownloadTime + MAX(TTL, Interval) * (1.0 + RANDOM (0.1))

Dove:
TS = "Next synchronize time" (data/ora della prossima sincronizzazione)
LastDownloadTime = data/ora dell'ultima sincronizzazione
TTL = Time To Live del feed (ogni quanto il feed viene aggiornato secondo l'autore)
Interval = intervallo di aggiornamento desiderato dall'utente, che sovrascrive l'intervallo di default (24 ore)

Prima di passare alle osservazioni più importanti sull' implementazione di applicazioni Windows RSS Platform-based, vediamo un semplice esempio di utilizzo il cui codice è veramente autoesplicativo. Lo scenario che si propone prevede il binding degli item di un feed RSS 2.0 ad un controllo ListView di WPF:

using Microsoft.Feeds.Interop;
using System.Runtime.InteropServices;

...

IFeedsManager feedsManager = null;
IFeedFolder RootFeefFolder = null;
const string feedUrl = "http://blogs.ugidotnet.org/dsantarelli/Rss.aspx";

try
{
 
feedsManager = new FeedsManagerClass();
 
RootFeefFolder = (IFeedFolder)feedsManager.RootFolder;

  // Creazione di una entry nello store dei Feed di IE7 a livello di root       
  
if (!feedsManager.IsSubscribed(feedUrl)) RootFeefFolder.CreateFeed("Dario Santarelli Feeds", feedUrl);                
  
  IFeed feed = (IFeed)feedsManager.GetFeedByUrl(feedUrl);
 
feed.DownloadEnclosuresAutomatically = true; // Gli enclosure verranno scaricati
 
feed.Interval = 360; // 6 ore
 
feed.Download();                
  
 
BindingList<IFeedItem> items = new BindingList<IFeedItem>();
 
foreach (IFeedItem item in (IFeedsEnum)feed.Items) items.Add(item);

 
MyRSSListView.DataContext = items; // Binding ad un ListView
}
finally
{               
 
Marshal.ReleaseComObject(feedsManager);
 
Marshal.ReleaseComObject(RootFeefFolder);
}


Un'importantissima considerazione va apportata sul metodo IFeed.AsyncDownload(), utilizzabile alternativamente al sopra citato IFeed.Download(). Infatti, chiamare questo metodo significa effettuare il download del feed in un thread diverso, ma se nel frattempo l'applicazione o lo script principale termina, anche il download viene interrotto senza riserve. In questi casi è opportuno dunque gestire l'evento FeedDownloadCompleted per evitare di trovarsi di fronte a bindings apparentemente senza effetto ;). E' importante inoltre notare come il download asincrono possa essere arrestato esplicitamente tramite il metodo CancelAsyncDownload. Diversa invece è la situazione per quanto concerne il download degli "enclosure" associati al feed: infatti, in questo ambito interviene il BITS (Background Intelligent Transfer Service), un servizio eseguito su un processo parallelo che si appoggia ad HTTP in caso di eventuali failures.
Beh che dire... Sembra tutto rose e fiori. In realtà non è così! Ci sono infatti diverse potenziali limitazioni con cui dobbiamo fare i conti nell'utilizzo di questa tecnologia:

  • Il numero massimo di feed parserizzabili dal FDE contemporaneamente è 4. I feed inseriti successivamente in coda sono gestiti in "preemptive mode" in base alla priorità.
  • Non ci sono eventi programmabili per quanto riguarda il download degli enclosures :(
  • la Common Feed List (FeedsManagerClass.RootFolder per capirci) è globalmente accessibile da tutte le applicazioni e da tutti gli utenti indistintamente
  • Un feed generico viene trattato come un oggetto IFeed basato su RSS 2.0. Non è possibile quindi elaborare il flusso secondo le specifiche dei vari protocolli originari.
  • Non è possibile specificare querystring nell' url del feed per autenticare un utente
  • FDE lavora soltanto nell' "Internet Zone" e non permette il download di molti tipi di file. I responsabili di tutto ciò sono le Attachment Execution Service API (AES)
  • RSS con dei DTD interni non sono supportati

Per maggiori informazioni consiglio di dare un'occhiata ai seguenti links:
http://msdn2.microsoft.com/en-us/library/ms686418.aspx (Introducing the Windows RSS Platform)
http://msdn2.microsoft.com/en-us/library/ms684701.aspx (Windows RSS Platform)
http://msdn2.microsoft.com/en-us/library/ms684702.aspx (Windows RSS Platform Reference)

 Technorati tags: ,

Print | posted on giovedì 13 settembre 2007 02:57 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET