2010-08-12 5 views
5

J'ai créé un HttpModule pour capturer des requêtes à des fins d'audit.Aide à la lecture de JSON à partir de HttpContext.InputStream

Pour les requêtes Ajax à une méthode Web, je voudrais également enregistrer les données JSON associées à la requête.

Par exemple, demande

HTTP/1.1
x-POST demandé avec /MyPage.aspx/AddRecord: XMLHttpRequest
Accept-Language: fr-fr
Referer: http://fiddlerlocal:5000/AddRecord.aspx
Accept: application/json, text/javascript, /
Type de contenu: application/json; charset = utf-8
UA-CPU: x86
Accept-Encoding: gzip, dégonfler
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022, .NET CLR 3.0.4506.2152, .NET CLR 3.5.30729)
hôte: fiddlerlocal: 5000
Content-Length: 287
Connection: Keep-Alive
Pragma: no-cache
Cookie: .....
{ "id": "282aa3b5-b55f-431c-916e-60433fdb61c0", "date": "06/08/2010"}

J'ai essayé une variété de méthodes pour lire le JSON ({ "id": "282aa3b5-b55f-431c-916e-60433fdb61c0", "date": "06/08/2010"}) de la HttpContext.InputStream.

Exemple 1:

lecteur StreamReader = new StreamReader (request.InputStream);
chaîne encodedString = lecteur.ReadToEnd(); - ReadToEnd retourne une chaîne vide

Exemple 2:

utilisant MemoryStream (ms = new MemoryStream()) {

byte [] buffer = new byte [request.ContentLength ]
request.InputStream.Read (buffer, 0, request.ContentLength);
ms.Ecrit (buffer, 0, request.ContentLength); - Le tableau d'octets contient le nombre correct d'octets, mais chaque octet a une valeur de 0 - codé comment?
return Convert.ToBase64String (ms.ToArray()); - ne fait rien
return Encoding.UTF8.GetString (ms.ToArray()); - ne fait rien
}

Comment puis-je extraire avec succès les données de HttpContext.InputStream?

Merci d'avance.

Répondre

0

Le flux ne peut pas être lu autant que je sache. Vous pouvez écrire votre propre gestionnaire, puis mettre en tampon le flux, en lisant et en écrivant dans un autre flux.

Pour analyser la partie JSON, vous pouvez essayer

System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(string input); 
+0

Nous vous remercions de votre réponse très rapide. – blahblahblah

21

je devais rétablir la position du flux avant de lire ...

request.InputStream.Position = 0;
utilisant (StreamReader fluxEntrée = new StreamReader (request.InputStream)) {

de inputStream.ReadToEnd de retour();
}