Start here. This is the direct spoken answer to practice first.
Why this question matters
The request body is a resource tied to the connection, not an ordinary reusable string. Reading and buffering decisions directly affect memory, disk, latency, and denial-of-service exposure.
The body stream is normally read forward once. Model binding or a formatter may consume it before later code sees it, so I avoid having several layers parse the same payload. If rereading is genuinely required, I enable buffering early, respect its thresholds and limits, and reset the stream position for the next consumer. For large uploads I stream to bounded processing or temporary storage instead of copying the entire body into memory.