Помогите прочитать JSON из HttpContext.InputStream - PullRequest
5 голосов
/ 12 августа 2010

Я создал HttpModule для сбора запросов в целях аудита.

Для запросов Ajax к веб-методу я также хотел бы регистрировать данные JSON, связанные с запросом.

Например, запрос

POST /MyPage.aspx/AddRecord HTTP / 1.1
x-request-with: XMLHttpRequest
Accept-Language: en-gb
Ссылка: http://fiddlerlocal:5000/AddRecord.aspx
Принять: application / json, текст / javascript, /
Тип содержимого: application / json;charset = utf-8
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla / 4.0 (совместимо; 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)
Хост: fiddlerlocal: 5000
Длина содержимого: 287
Соединение: сохранить-Живой
Прагма: без кеширования
Cookie: .....
{"id": "282aa3b5-b55f-431c-916e-60433fdb61c0", "date": "8-6-2010 "}

Я пробовал различные методы для чтения JSON ({" id ":" 282aa3b5-b55f-431c-916e-60433fdb61c0 "," date ":"8-6-2010"}) из HttpContext.InputStream.

Пример 1:

Считыватель StreamReader = новый StreamReader (request.InputStream);
string encodedString =reader.ReadToEnd (); - ReadToEnd возвращает пустую строку

Пример 2:

с использованием (MemoryStream ms = new MemoryStream ())
{
byte [] buffer = new byte [request.ContentLength];
request.InputStream.Read (buffer, 0, request.ContentLength);
ms.Write (buffer, 0, request.ContentLength); - Массив байтов содержит правильное количество байтов, но каждый байт имеет значение 0 - как-то закодировано?
return Convert.ToBase64String (ms.ToArray ()); - ничего не делает
return Encoding.UTF8.GetString (ms.ToArray ()); - ничего не делает
}

Как мне успешно извлечь данные из HttpContext.InputStream?

Заранее спасибо.

Ответы [ 2 ]

21 голосов
/ 12 августа 2010

Мне нужно было сбросить позицию потока перед чтением ...

request.InputStream.Position = 0;
используя (StreamReader inputStream = новый StreamReader (request.InputStream))
{
return inputStream.ReadToEnd ();
}

0 голосов
/ 12 августа 2010

Насколько я знаю, поток не может быть прочитан.Вы можете написать свой собственный обработчик, а затем буферизовать поток, читая и записывая в другой поток.

Для разбора части JSON вы можете попробовать

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