WCF.Syndication où comment créer facilement un flux RSS

Finalement après avoir crée moi même ma feed RSS avec Linq2Xml, et m’etre fait chier avec la syntaxe RSS, j’ai changé d’outil et sur les conseils de Patrice Lamarche j’ai utilisé les classes fournies par WCF dans le namespace WCF.syndication. Ce namespace contient en effet des classes permettant entre autres de créer facilement des feeds RSS et/ou Atom sans se préoccuper de la syntaxe xml adéquate.

 La doc de Microsoft propose plusieurs examples nottament celui qui m’interresse: comment héberger un service WCF fournissant une feed sous forme de RSS et d’Atom. Ceci dit l’example propose que le service soit hebergé par une application console. Ici j’ai besoin surtout de récupérer un flux xml au bon format.

J’ai donc juste utilisé les classes fournies par ce namespace pour obtenir mon flux et le fournir via mon webhandler:

Je recupère mes données via une classe de services qui me remplis mes entités :

image

Je vais pouvoir « transformer » ces entités en SyndicationItem qui vont me permettre d’obtenir le flux.

Tout d’abord créer l’objet SyndicationFeed et fournir les infos de base : auteur, description, url, etc:

SyndicationFeed feed = new SyndicationFeed("Paslatek Blog", "Feed for paslatek blog", new Uri("http://www.paslatek.net"));
        feed.Authors.Add(new SyndicationPerson("lionel.limozin@bewise.fr"));
        feed.Description = new TextSyndicationContent("This is a 'Code' blog from an bewise's employee. This blog is speaking about Microsoft's programming technologies");
        

Ensuite on peut indiquer les catégories, je transforme ma List<Tag> en tant que SyndicationCategory :

var tags = from t in Services.GetTags()
        select new SyndicationCategory(t.Name);
        foreach (var tag in tags)
        feed.Categories.Add(tag);

Ensuite je récupère donc mes posts sous forme de SyndicationItem :

var items = from i in Services.GetPosts(0, 10, null)
        select new SyndicationItem(
        HttpUtility.HtmlDecode(i.Title),
        i.Content,
        new Uri("http://www.paslatek.net/Details.aspx?id=" + i.Id),
        i.Id.ToString(),
        i.Date);

        feed.Items = items.ToList();

Et enfin j’utilise un « formatter » pour obtenir mon flux au format désiré , par exemple en fonction d’un type fourni à ma méthode :

SyndicationFeedFormatter form = null;
        if (type == FeedType.Rss)
        form = new Rss20FeedFormatter(feed);
        else
        form = new Atom10FeedFormatter(feed);

        using (StringWriter str = new StringWriter())
        {
        using (XmlTextWriter writer = new XmlTextWriter(str))
        {
        form.WriteTo(writer);
        }
        return str.ToString();
        }

Et voilà je n’ai plus qu’à utiliser le retour de cette fonction comme sortie de mon webhandler et c’est gagné ! 🙂

Le code complet :

public enum FeedType
        {
        Rss,
        Atom,
        }

        public class RssService
        {
        public static string GetBlog(FeedType type)
        {
        SyndicationFeed feed = new SyndicationFeed("Paslatek Blog", "Feed for paslatek blog", new Uri("http://www.paslatek.net"));
        feed.Authors.Add(new SyndicationPerson("lionel.limozin@bewise.fr"));
        var tags = from t in Services.GetTags()
        select new SyndicationCategory(t.Name);
        foreach (var tag in tags)
        feed.Categories.Add(tag);

        feed.Description = new TextSyndicationContent("This is a 'Code' blog from an bewise's employee. This blog is speaking about Microsoft's programming technologies");

        var items = from i in Services.GetPosts(0, 10, null)
        select new SyndicationItem(
        HttpUtility.HtmlDecode(i.Title),
        i.Content,
        new Uri("http://www.paslatek.net/Details.aspx?id=" + i.Id),
        i.Id.ToString(),
        i.Date);

        feed.Items = items.ToList();


        SyndicationFeedFormatter form = null;
        if (type == FeedType.Rss)
        form = new Rss20FeedFormatter(feed);
        else
        form = new Atom10FeedFormatter(feed);

        using (StringWriter str = new StringWriter())
        {
        using (XmlTextWriter writer = new XmlTextWriter(str))
        {
        form.WriteTo(writer);
        }
        return str.ToString();
        }


        }
        }
Tagués avec : , , , ,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Verifions que vous êtes un humain * Time limit is exhausted. Please reload CAPTCHA.