8
votes

Comment supporter les demandes HTTP compressées dans ASP.NET 4.0 / IIS7?

Pour une application Web ASP.NET 4.0 / IIS7, je souhaite prendre en charge les demandes HTTP . Fondamentalement, je voudrais supporter les clients qui ajouteraient Content-coding: gzip dans les en-têtes de la demande et compressez le corps en conséquence.

Quelqu'un est-il connu comment j'abandonne un tel comportement?

PS: En ce qui concerne, j'ai de multiples points de terminaison de repos et de savon, et il ressort une meilleure solution pour supporter la compression au niveau HTTP plutôt que des codeurs personnalisés pour chaque point d'extrémité.


0 commentaires

3 Réponses :


5
votes

Pour ceux qui pourraient être intéressés, la mise en œuvre est assez simple avec un ihttpmodule qui filtre simplement des demandes entrantes. xxx

Mise à jour: Il semble que cette approche déclenche un problème dans WCF, car WCF s'appuie sur l'original longueur de contenu et non la valeur obtenue après décompression.


4 commentaires

J'avais l'impression qu'il est possible de configurer la compression au niveau IIS plutôt dans votre application hébergée. Cependant, je ne sais pas grand chose à ce sujet, juste une suggestion Google "Compression IIS"


La compression HTTP classique s'applique uniquement à Réponses , voici les demandes J'essaie de compresser.


Non, à la fin, nous avons décidé de ré-implémenter notre propre pile HTTP :-(


@Joannesvermorel Essayez la solution de Wiktor ici: Stackoverflow.com/questions/16671216/... (notant mes bugfixes dans ma propre réponse).



1
votes

Essayez la réponse de Wiktor à ma question similaire ici:

Comment activer la compression GZIP pour Post (téléchargez-vous) des requêtes sur un service Web SOAP sur IIS 7?

... Mais veuillez noter que sa mise en œuvre sur son blog contenait quelques problèmes de bugs / compatibilité, alors essayez ma version patchée de la classe HTTPCompressionModule publiée sur la même page.


0 commentaires

0
votes

Bien que Hacky, vous pouvez vous déplacer autour de la WCF à l'aide de l'original longueur de contenu code> même après la décompression de la requête en définissant le champ privé _ContentLongueur code> dans le httpecrets code> classe en utilisant la réflexion. Utilisation du code de Joannes Vermorel:

    void BeginRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;

        if ("gzip" == app.Request.Headers["Content-Encoding"])
        {
            app.Request.Filter = new GZipStream(
                app.Request.Filter, CompressionMode.Decompress);

            // set private _contentLength field with new content length after the request has been decompressed
            var contentLengthProperty = typeof(HttpRequest).GetField("_contentLength", BindingFlags.NonPublic | BindingFlags.Instance);
            contentLengthProperty.SetValue(app.Request, (Int32)app.Request.InputStream.Length);
        }
    }


0 commentaires