Josh M.
Josh M.

Reputation: 27831

How to get raw request body in ASP.NET?

In the HttpApplication.BeginRequest event, how can I read the entire raw request body? When I try to read it the InputStream is of 0 length, leading me to believe it was probably already read by ASP.NET.

I've tried to read the InputStream like this:

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

But all I get is an empty string. I've reset the position back to 0, but of course once the stream is read it's gone for good, so that didn't work. And finally, checking the length of the stream returns 0.

Edit: This is for POST requests.

Upvotes: 44

Views: 70449

Answers (6)

jjaskulowski
jjaskulowski

Reputation: 2574

It is important to reset position of 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);
}

Upvotes: 4

Tomas Smagurauskas
Tomas Smagurauskas

Reputation: 706

In ASP.NET Core 2:

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

Upvotes: 6

Ian
Ian

Reputation: 4467

Pål's answer is correct, but it can be done much shorter as well:

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

This is with .NET 4.6.

Upvotes: 20

Dale Anderson
Dale Anderson

Reputation: 1711

I had a similar requirement to get the raw content and struck the same issue. I found that calling Seek(0, SeekOrigin.Begin) solved the problem.

This is not a particularly good approach as it makes assumptions about how the underlying infrastructure operates, but it seems to work.

Upvotes: 4

Pål Thingbø
Pål Thingbø

Reputation: 1301

The request object is not populated in the BeginRequest event. You need to access this object later in the event life cycle, for example Init, Load, or PreRender. Also, you might want to copy the input stream to a memory stream, so you can use seek:

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();
    }
}

Upvotes: 29

Josh M.
Josh M.

Reputation: 27831

Here's what I ended up doing:

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

Upvotes: -9

Related Questions