2010-08-12 12 views
5

Ich habe ein HttpModule zum Erfassen von Anforderungen für Überwachungszwecke erstellt.Hilfe beim Lesen von JSON aus HttpContext.InputStream

Für Ajax-Anfragen an eine Web-Methode möchte ich auch die JSON-Daten, die mit der Anfrage verbunden sind, protokollieren.

Eg Anfrage

POST /MyPage.aspx/AddRecord HTTP/1.1
x-requested-mit: XMLHttpRequest
Accept-Language: en-de
Referer: http://fiddlerlocal:5000/AddRecord.aspx
Accept: application/json, text/javascript, /
Inhaltstyp: application/json; charset = utf-8
UA-CPU: x86
Accept-Encoding: gzip,
User-Agent abzulassen: 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)
Host: fiddlerlocal: 5000
Content-Length: 287
Connection: Keep-Alive-
Pragma: no-cache
Cookie: .....
{ "id": "282aa3b5-b55f-431c-916e-60433fdb61c0", "Datum": "2010.08.06"}

Ich habe eine Vielzahl von Methoden versucht, die JSON ({ "id": "282aa3b5-b55f-431c-916e-60433fdb61c0", "Datum": "2010.08.06"}) zu lesen, aus dem HttpContext.InputStream.

Beispiel 1:

Streamreader reader = new Streamreader (request.InputStream);
Zeichenfolge encodedString = reader.ReadToEnd(); - ReadToEnd gibt eine leere Zeichenfolge

Beispiel 2:

Verwendung (Memory ms = new Memory()) {

byte [] buffer = new byte [request.ContentLength ];
request.InputStream.Read (Puffer, 0, request.ContentLength);
ms.Write (Puffer, 0, request.ContentLength); - Das Byte-Array enthält die richtige Anzahl von Bytes, aber jedes Byte hat einen Wert von 0 - codiert wie?
Rückgabe Convert.ToBase64String (ms.ToArray()); - macht nichts
return Encoding.UTF8.GetString (ms.ToArray()); - macht nichts
}

Wie kann ich die Daten erfolgreich aus HttpContext.InputStream extrahieren?

Vielen Dank im Voraus.

Antwort

0

Der Stream kann nicht gelesen werden, soweit ich weiß. Sie könnten Ihren eigenen Handler schreiben und dann den Stream puffern, indem Sie in einen anderen Stream lesen und schreiben.

die JSON Teil analysieren Sie

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

Vielen Dank für Ihre sehr schnelle Antwort. – blahblahblah

21

Ich brauchte die Position des Stroms zurücksetzen, bevor das Lesen versuchen könnte ...

request.InputStream.Position = 0;
Verwendung (StreamReader inputStream = new StreamReader (request.InputStream))
{
Rückgabe inputStream.ReadToEnd();
}