Search code examples
c#httpcontent

CopyToAsync vs ReadAsStreamAsync for huge request payload


I have to compute hash for huge payload, so I am using streams not to load all request content in memory. The question is what are the differences between this code:

using (var md5 = MD5.Create())
using (var stream = await authenticatableRequest.request.Content.ReadAsStreamAsync())
{
    return md5.ComputeHash(stream);
}

And that one:

using (var md5 = MD5.Create())  
using (var stream = new MemoryStream())
{
    await authenticatableRequest.request.Content.CopyToAsync(stream);
    stream.Position = 0;

    return md5.ComputeHash(stream);
}

I expect the same behavior internally, but maybe I am missing something.


Solution

  • The first version looks Ok, let the hasher handle the stream reading. It was designed for that.

    ComputeHash(stream) will read blocks in a while loop and call TransformBlock() repeatedly.

    But the second piece of code will load everything into memory, so don't do that:

    using (var stream = new MemoryStream())
    {
        await authenticatableRequest.request.Content.CopyToAsync(stream);