Ответ 1
Вот что я в итоге сделал:
//Save the request content. (Unfortunately it can't be written to a stream directly.)
context.Request.SaveAs(filePath, false);
В событии HttpApplication.BeginRequest
, как я могу прочитать весь необработанный объект запроса? Когда я пытаюсь прочитать его, InputStream
имеет длину 0, что заставляет меня поверить, что он, вероятно, уже был прочитан ASP.NET.
Я попытался прочитать InputStream следующим образом:
using (StreamReader reader = new StreamReader(context.Request.InputStream))
{
string text = reader.ReadToEnd();
}
Но все, что я получаю, это пустая строка. У меня reset позиция назад до 0, но, разумеется, после того, как поток прочитан, он прошел хорошо, так что это не сработало. И, наконец, проверка длины потока возвращает 0.
Изменить: Это для запросов POST.
Вот что я в итоге сделал:
//Save the request content. (Unfortunately it can't be written to a stream directly.)
context.Request.SaveAs(filePath, false);
Объект запроса не заполняется в событии BeginRequest. Вам нужно получить доступ к этому объекту позже в жизненном цикле события, например Init, Load или PreRender. Кроме того, вы можете скопировать входной поток в поток памяти, чтобы вы могли использовать поиск:
protected void Page_Load(object sender, EventArgs e)
{
MemoryStream memstream = new MemoryStream();
Request.InputStream.CopyTo(memstream);
memstream.Position = 0;
using (StreamReader reader = new StreamReader(memstream))
{
string text = reader.ReadToEnd();
}
}
У меня было аналогичное требование получить исходный контент и поразить ту же проблему. Я обнаружил, что вызов Seek(0, SeekOrigin.Begin)
решил проблему.
Это не очень хороший подход, поскольку он делает предположения о том, как работает базовая инфраструктура, но, похоже, работает.
Пол ответил правильно, но его можно сделать гораздо короче:
string req_txt;
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
{
req_txt = reader.ReadToEnd();
}
Это с.NET 4.6.
Важно сбросить позицию InputStream.
var memstream = new MemoryStream();
Request.InputStream.CopyTo(memstream);
Request.InputStream.Position = 0;
using (StreamReader reader = new StreamReader(memstream)) {
var text = reader.ReadToEnd();
Debug.WriteLine(text);
}
В ASP.NET Core 2:
using (var reader = new StreamReader(HttpContext.Request.Body)) {
var body = reader.ReadToEnd();
}