IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]flux rss et compression gzip


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut [C#]flux rss et compression gzip
    Bonjour,
    je debute en C# et je veux crée un petit gestion de flux rss

    les flux rss non compressé fonctionne tres bien mais pas les compressé.

    je souhaite ajouter le support de la compression gzip.

    pour info j'utilise la XmlTextReader pour gerre mon xml

    pouvais vous m'aider.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,

    Utilises plutôt System.ServiceModel.Web.SyndicationFeed qui va mieux dans ce cas.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Salut,

    Utilises plutôt System.ServiceModel.Web.SyndicationFeed qui doit mieux ce cas.
    le resultat est le meme, je n'arrive pas a parcer mon flux qui arrive en compressé en gzip

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Pirion Voir le message
    Bonjour,
    je debute en C# et je veux crée un petit gestion de flux rss

    les flux rss non compressé fonctionne tres bien mais pas les compressé.

    je souhaite ajouter le support de la compression gzip.

    pour info j'utilise la XmlTextReader pour gerre mon xml

    pouvais vous m'aider.
    Je pense que la classe GZipStream devrait t'aider

    Citation Envoyé par cybermaxs Voir le message
    Salut,

    Utilises plutôt System.ServiceModel.Web.SyndicationFeed qui doit mieux ce cas.
    Je sais pas si ça gère la compression, mais c'est clair que c'est plus simple que de décoder le RSS à la main

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    euh

    J'ai peur qu'il faille dans ce cas faire la requête par toi même via HttpWebRequest. Voici un lien qui doit t'aider pour ça (méthode GetUrl).

    à la fin de la méthode essaye de pluger le XmlReader avec SyndicationFeed

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    ça doit pouvoir se gérer avec un WebClient.OpenRead + GZipStream...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string feedUrl = "http://www.developpez.com/index/rss";
    using (WebClient wc = new WebClient())
    using (Stream netStream = wc.OpenRead(feedUrl))
    using (Stream gzStream = new GZipStream(netStream, CompressionMode.Decompress))
    using (XmlReader reader = XmlReader.Create(gzStream))
    {
        SyndicationFeed feed = SyndicationFeed.Load(reader);
        // ...
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Merci a tous !
    voila se que j'ai fait :

    j'ai fait un classe gestionFlux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Web;
    using System.Net;
    using System.IO.Compression;
     
    namespace RSS_Reader
    {
        class GestionFlux
        {
            /// <summary>
            /// Determines if GZip is supported
            /// </summary>
            /// <returns></returns>
            public static bool IsGZipSupported()
            {
                string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
                if (!string.IsNullOrEmpty(AcceptEncoding) &&
                     (AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
                    return true;
                return false;
            }
     
            /// <summary>
            /// Sets up the current page or handler to use GZip through a Response.Filter
            /// IMPORTANT:  
            /// You have to call this method before any output is generated!
            /// </summary>
            public static void GZipEncodePage()
            {
                if (IsGZipSupported())
                {
                    HttpResponse Response = HttpContext.Current.Response;
     
                    string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
                    if (AcceptEncoding.Contains("gzip"))
                    {
                        Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                        Response.AppendHeader("Content-Encoding", "gzip");
                    }
                    else
                    {
                        Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter,
                                                  System.IO.Compression.CompressionMode.Compress);
                        Response.AppendHeader("Content-Encoding", "deflate");
                    }
                }
            }
     
            public static String GetUrl(string Url)
            {
                HttpWebRequest Http = (HttpWebRequest)WebRequest.Create(Url);
                Http.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
     
     
                HttpWebResponse WebResponse = (HttpWebResponse)Http.GetResponse();
     
                Stream responseStream = responseStream = WebResponse.GetResponseStream();
                if (WebResponse.ContentEncoding.ToLower().Contains("gzip"))
                    responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                else if (WebResponse.ContentEncoding.ToLower().Contains("deflate"))
                    responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
     
                StreamReader Reader = new StreamReader(responseStream, Encoding.Default);
     
                string feed = Reader.ReadToEnd();
     
                WebResponse.Close();
                responseStream.Close();
     
                return feed;
            }
     
        }
    }
    et voila le corp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String feedString = GestionFlux.GetUrl(feedUrl);
                byte[] byteArray = Encoding.ASCII.GetBytes(feedString);
                using (MemoryStream gzStream = new MemoryStream( byteArray ))
                using (XmlReader reader = XmlReader.Create(gzStream))
                {
                    SyndicationFeed feed = SyndicationFeed.Load(reader);
                    foreach(SyndicationItem item in feed.Items)
                    {
     
                                    //...
                    }
                }

    dite moi ce que vous en pensé

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    premier truc, est-ce que ça marche ?

    En second, ton code est découplé, c'est bien, mais je pense qu'il y a une étape en trop. Le GetUrl converti le flux en string pour l'envoyer vers l'objet RSS. Il vaut mieux renvoyer directement un Stream. En plus si tu flux est gros (même compressé), les perfs seront meilleures.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    premier truc, est-ce que ça marche ?
    oui cela fonctionne sans probleme

    Citation Envoyé par cybermaxs Voir le message
    En second, ton code est découplé, c'est bien, mais je pense qu'il y a une étape en trop. Le GetUrl converti le flux en string pour l'envoyer vers l'objet RSS. Il vaut mieux renvoyer directement un Stream. En plus si tu flux est gros (même compressé), les perfs seront meilleures.

    j'avais converti en String car cela m'eviter de devoir appeller un autre fonction dans mon main pour fermer la reponse et le Stream

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WebResponse.Close();
    responseStream.Close();

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    ça vrai, ça a un certains sens.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. activer/désactiver la compression GZIP des pages
    Par iubito dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 20/08/2008, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo