Подтвердить что ты не робот

Как получить необработанное тело запроса в ASP.NET?

В событии HttpApplication.BeginRequest, как я могу прочитать весь необработанный объект запроса? Когда я пытаюсь прочитать его, InputStream имеет длину 0, что заставляет меня поверить, что он, вероятно, уже был прочитан ASP.NET.

Я попытался прочитать InputStream следующим образом:

using (StreamReader reader = new StreamReader(context.Request.InputStream))
{
    string text = reader.ReadToEnd();
}

Но все, что я получаю, это пустая строка. У меня reset позиция назад до 0, но, разумеется, после того, как поток прочитан, он прошел хорошо, так что это не сработало. И, наконец, проверка длины потока возвращает 0.

Изменить: Это для запросов POST.

4b9b3361

Ответ 1

Вот что я в итоге сделал:

//Save the request content. (Unfortunately it can't be written to a stream directly.)
context.Request.SaveAs(filePath, false);

Ответ 2

Объект запроса не заполняется в событии 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();
    }
}

Ответ 3

У меня было аналогичное требование получить исходный контент и поразить ту же проблему. Я обнаружил, что вызов Seek(0, SeekOrigin.Begin) решил проблему.

Это не очень хороший подход, поскольку он делает предположения о том, как работает базовая инфраструктура, но, похоже, работает.

Ответ 4

Пол ответил правильно, но его можно сделать гораздо короче:

string req_txt;
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
{
    req_txt = reader.ReadToEnd();
}

Это с.NET 4.6.

Ответ 5

Важно сбросить позицию 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);
}

Ответ 6

В ASP.NET Core 2:

using (var reader = new StreamReader(HttpContext.Request.Body)) {
    var body = reader.ReadToEnd();
}