来自 HttpContent 的 MemoryStream 无需复制

MemoryStream from HttpContent without copying

我正在尝试将 System.Net.Http 用于 POST 请求。我可以接受 HTTP 响应主体在内存中,但需要为其获取 MemoryStream。一种方法是调用 HttpContent.GetAsByteArrayAsync() 并在其上包装一个 MemoryStream,但我认为这需要将内容复制到一个单独的字节数组中(因为它 returns Task byte[]).

如果响应主体已经在 HttpContent 的某个内部缓冲区中,是否可以在该缓冲区之上创建 MemoryStream,或者 return 来自 HttpContent 的 MemoryStream 并避免复制到单独的字节数组?

还有HttpContent.GetAsStreamAsync(),但是那个return是普通的Stream,不是MemoryStream。尽管它可能已经是 MemoryStream 的一个实例,但我认为将 returned 流强制转换为 MemoryStream 是不安全的还是一种好的做法? (因为这是可能会更改的实现细节)。

有没有其他方法可以做到这一点,或者我别无选择只能先复制到 byte[]?

谢谢。

如果先调用LoadIntoBufferAsyncReadAsStreamAsync returns a readonly MemoryStream:

await req.Content.LoadIntoBufferAsync();
var stream = (MemoryStream) await req.Content.ReadAsStreamAsync();

如果您先调用 LoadIntoBufferAsyncCopyToAsync 可用于填充 readonly MemoryStream:

var stream = new MemoryStream(req.Content.Headers.ContentLength);
await req.Content.LoadIntoBufferAsync((int)req.Content.Headers.ContentLength);
await req.Content.CopyToAsync(stream);

此实现不依赖于副作用,所有框架版本的文档都支持:https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpcontent.loadintobufferasync?view=netframework-4.6.2

注意:我试图编辑上面的答案,但无法做到...所以给你。