在 HttpClient 响应内容上调用 ReadAsString 然后调用 ReadAsStream 是否安全?

Mar*_*cze 1 .net c# .net-core

在 .NET Core 上,使用System.Net.Http.HttpClient,先调用response.Content.ReadAsStringAsync(),然后调用是否安全response.Content.ReadAsStreamAsync()
例如,做这样的事情。

var response = await client.GetAsync("http://example.com");

var respStr = await response.Content.ReadAsStringAsync();
// ... Do something with the string

var respStream = await response.Content.ReadAsStreamAsync();
// ... Do something with the stream
Run Code Online (Sandbox Code Playgroud)

我担心响应内容会被传输,因此无法阅读两次。

我已经用几个请求对其进行了测试,它总是对我有用,但它能保证有效吗?

Set*_*Set 5

是的,只要内容不被丢弃,它就是安全的。

如果您查看HttpContent类中如何实现这些方法(response.Content返回实例),您将看到内部使用内存缓冲区。

public Task<string> ReadAsStringAsync()
{
    CheckDisposed();
    return WaitAndReturnAsync(LoadIntoBufferAsync(), this, s => s.ReadBufferedContentAsString());
}
Run Code Online (Sandbox Code Playgroud)

public Task<Stream> ReadAsStreamAsync()
{
    CheckDisposed();

    ArraySegment<byte> buffer;
    if (_contentReadStream == null && TryGetBuffer(out buffer))
    {
        _contentReadStream = Task.FromResult<Stream>(new MemoryStream(buffer.Array, buffer.Offset, buffer.Count, writable: false));
    }


    if (_contentReadStream != null)
    {
        return _contentReadStream;
    }


    _contentReadStream = CreateContentReadStreamAsync();
    return _contentReadStream;
}
Run Code Online (Sandbox Code Playgroud)