Read request body multiple times in ASP.NET Core
04 Jan 2022In ASP.NET Core, the request can not be read once it is consumed. If you want to read the request body multiple times, you need to set
context.Request.EnableBuffering()
As you know, the request body stream is forward only, you can not read the content from the body once it gets read by middleware or handler. The above method introduced in ASP.NET Core 2.1, provides multiple time seekable request body streams. This method copy incoming request body stream into FileBufferingReadStream.
Note:
Request.EnableBufferingmust be used before any operation is performed on the request body. As you know once the request body is read, it can not read again.
FileBufferingReadStream wraps incoming request stream enable rewinding by buffering content as it is read. The content is buffered in memory up to a certain size and then spooled to a temp file on disk. The temp file will be deleted on request disposal.
Prior to ASP.NET Core 2.1, Request.EnableRewind() get used to make seekable multiple time. Actually Request.EnableBuffering() call Request.EnableRewind() method internally. But Request.EnableBuffering is in a public namespace rather than internal one, it should be prefered over Request.EnableRewind().
Then to read the body stream you could for example do this:
string bodyContent = new StreamReader(Request.Body).ReadToEnd();
Note: Do not wrap the stream reader instance in
usingblock, because it will dispose of the underline stream and code later in the request lifecycle won’t be able to read the body.
On the safer side, set the Request.Body.Position reset to 0. That way any code later in the request lifecycle will find the request body in the state just like it hasn’t been read yet.
Request.Body.Position = 0;
Things to do for reading or seeking Request.Body multiple times:
- Use
Request.EnableBufferingprior to any read operation onRequest.Bodystream. - Don’t dispose of the
StreamviaStreamReaderinstance. - Reset
Request.Body.Positionto 0.
Just keep in mind that:
- Even though the memory stream is rented from a pool, it still has memory costs associated with it.
- After the read is over the bufferThreshold in FileBufferingReadStream, the performance will be slower since a file stream will be used.