2017-02-19 12 views
0

На .NET Core, используя System.Net.Http.HttpClient, безопасно ли сначала позвонить response.Content.ReadAsStringAsync(), а затем позвонить response.Content.ReadAsStreamAsync()?
Например, сделайте что-нибудь подобное.Безопасно ли вызывать ReadAsString, а затем ReadAsStream на контенте HttpClient?

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 

Я беспокоюсь о том, что содержимое ответа передается, так что его невозможно прочитать дважды.

Я тестировал его с помощью нескольких запросов, и он всегда работает для меня, но гарантированно ли он работает?

ответ

1

Да, это безопасно, пока контент не расположен.

Если вы посмотрите, как эти методы реализованы в классе HttpContent (response.Content возвращает экземпляр), вы увидите, что буфер памяти используется внутри.

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

и

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; 
}