Response.filter : manipulation du stream de sortie asp.net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 058 fois - Téléchargée 15 fois

Contenu du snippet

Dans certains cas, on a besoin de pouvoir manipuler le Stream dans lequel écrit ASP.net. Par exemple, on aimerait récupérer le flux de sortie afin d'enregistrer dans un fichier toutes les pages générées par ASP.net
Pour cela l'objet HttpResponse expose une propriété Filter. Cette propriété de type Stream est en lecture/écriture.

Cette source montre comment écraser la propriété Response.Filter afin d'enregistrer le flux envoyé au client sur le disque.
Pour cela nous utilisons un HttpModule.

Source / Exemple :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.UI;

public class FilterSampleModule : IHttpModule
{

    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        if (!(HttpContext.Current.Handler is Page))
            return;

        HttpContext.Current.Response.Filter = new MyStream(HttpContext.Current.Response.Filter);
    }

}

public class MyStream : Stream
{

    private Stream _originalStream;
    private Stream _newStream;

    public MyStream(Stream originalStream)
    {
        this._originalStream = originalStream;
        this._newStream = new FileStream(@"c:/toto.html", FileMode.Create);
    }

    public override bool CanRead
    {
        get { return this._originalStream.CanRead; }
    }

    public override bool CanSeek
    {
        get { return this._originalStream.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return this._originalStream.CanWrite; }
    }

    public override void Flush()
    {
        this._newStream.Flush();
        this._originalStream.Flush();
    }

    public override long Length
    {
        get { return this._originalStream.Length; }
    }

    public override long Position
    {
        get
        {
            return this._originalStream.Position;
        }
        set
        {
            this._originalStream.Position = value;
            this._newStream.Position = value;
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        this._newStream.Read(buffer, offset, count);
        return this._originalStream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        this._newStream.Seek(offset, origin);
        return this._originalStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        this._originalStream.SetLength(value);
        this._newStream.SetLength(value);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        this._originalStream.Write(buffer, offset, count);
        this._newStream.Write(buffer, offset, count);
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        if (disposing)
            this._newStream.Dispose();
    }

}

Conclusion :


D'autres informations sont également disponible ici :

Cette source est juste un exemple d'utilisation de la propriété HttpResponse.Filter (http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx)

Afin que cela fonctionne, n'oublier pas d'inscrire le HttpModule dans le web.config.

<configuration>
<system.web>
<httpModules>
<add name="FilterSampleModule" type="FilterSampleModule, App_Code"/>
</httpModules>
</system.web>
</configuration>

A voir également

Ajouter un commentaire

Commentaires

lakichemole
Messages postés
253
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
Interressant, ça pourrais servir pour des tests?
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
Si tu fais tes tests avec Visual Studio, tu n'as pas besoin de ça, c'est nativement intégré.

De mémoire, tu peux faire un test unitaire avec l'attribut et spécifier l'attribut HostType("ASP.net") et UrlToTest. Tu dois également pouvoir récuperer la réponse à partir d'un test web classique.
lakichemole
Messages postés
253
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
Oui je vais voir régulièrement ton blog, j'ai vu l'histoire du hostType et de l'appDomain c'est pas mal d'ailleur. Mais j'essayais de voir à quoi ça pourrais nous servir le response.filter, on pourrais imaginer un espèce de proxy basé la dessus?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.