2009-11-05 4 views
23

Je suis en train de connecter le contenu d'une requête http, en utilisant un IHttpModule comme ceci:Comment se connecter demande inputstream avec HttpModule, puis réinitialiser la position InputStream

public class LoggingModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += ContextBeginRequest; 
    } 

    private void ContextBeginRequest(object sender, EventArgs e) 
    { 
     var request = ((HttpApplication)sender).Request; 
     string content; 

     using (var reader = new StreamReader(request.InputStream)) 
     { 
      content = reader.ReadToEnd(); 
     } 

     LogRequest(content) 
    } 
} 

Le problème est que, après la lecture du flux d'entrée à la fin, le InputStream semble avoir disparu ou plus probablement, le curseur est à la fin du flux.

J'ai essayé request.InputStream.Position = 0; et request.InputStream.Seek(0, SeekOrigin.Begin); mais aucun travail.

Répondre

31

J'ai résolu le problème: Je pense que l'appel disposé sur le StreamReader doit également tuer le InputStream.

Au lieu d'utiliser StreamReader je l'ai fait ce qui suit:

 var bytes = new byte[request.InputStream.Length]; 
     request.InputStream.Read(bytes, 0, bytes.Length); 
     request.InputStream.Position = 0; 
     string content = Encoding.ASCII.GetString(bytes); 

donc le code complet:

public class LoggingModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += ContextBeginRequest; 
    } 

    private void ContextBeginRequest(object sender, EventArgs e) 
    { 
     var request = ((HttpApplication)sender).Request; 

     var bytes = new byte[request.InputStream.Length]; 
     request.InputStream.Read(bytes, 0, bytes.Length); 
     request.InputStream.Position = 0; 
     string content = Encoding.ASCII.GetString(bytes); 

     LogRequest(content) 
    } 
} 
+6

Soyez prudent avec l'encodage là, je pense que vous voulez qu'il soit Encoding.UTF8.GetString (octets); – SimonF

+0

Bonne réponse !! +1 –

1

Vous devez utiliser un request filter. Écrivez une classe dérivée de Stream et enregistrez-la comme un filtre.

1

cette réponse ne fonctionne pas. il retourne un tableau qui contient des valeurs nulles.

 
     var bytes = new byte[request.InputStream.Length]; 
     request.InputStream.Read(bytes, 0, bytes.Length); 
     request.InputStream.Position = 0; 
     string content = Encoding.ASCII.GetString(bytes);

parce que le flux d'entrée est consommé.

-1

parfois, RequestFilter ne pas exécuter la méthode Lire. Il semble être W3WP ne pas lire le contenu de httprequest par voie normale.

Si vous déployez WEbservice sur le serveur. Ensuite, utilisez IHttpModule pour l'attraper. Ajouter RequestFilter.

Mais la méthode Read() de RequestFilter ne couriez pas: P

13

Oui StreamReader fermera le flux fourni.

Si vous utilisez> v4.5, utilisez un constructeur StreamReader qui laisse le flux ouvert.

using (var reader = new StreamReader(request.InputStream, Encoding.UTF8, true, 1024, true)) 
{ 
    content = reader.ReadToEnd(); 
} 
1

je devais faire un petit coup sec à la réponse fournie par « cbp ». En utilisant son code j'ai juste des zéros. J'ai bougé en réglant la position à 0 au dessus de la lecture et maintenant ça marche.

var bytes = new byte[Request.InputStream.Length]; 
Request.InputStream.Position = 0; 
Request.InputStream.Read(bytes, 0, bytes.Length); 
string content = Encoding.ASCII.GetString(bytes); 
Questions connexes