2017-02-19 17 views
0

.NETコアでSystem.Net.Http.HttpClientを使用している場合は、最初にresponse.Content.ReadAsStringAsync()に電話をかけてからresponse.Content.ReadAsStreamAsync()に電話をかけても安全ですか?
たとえば、次のような操作を行います。HttpClientレスポンスでReadAsStringを呼び出してからReadAsStreamを呼び出すのは安全ですか?Content?

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 

私はそれはそれを2回読み出すことはできませんように、応答内容がストリーミングされる心配です。

私はいくつかのリクエストでそれをテストしましたが、それはいつも私にとっては効果的ですが、動作することは保証されていますか?

答えて

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; 
} 
関連する問題