![](/img/trans.png)
[英]Using a StreamWriter and StreamReader results in error “Stream not readable”
[英]“stream was not readable” ArgumentException when using ReadAsStreamAsync with StreamReader
我有以下代碼來讀取和處理使用StreamReader的Http get請求的響應:
try
{
Stream stream = await ExecuteRequestAsync(uriBuilder.Uri, HttpMethod.Get).ConfigureAwait(false);
if (stream != null)
{
using (StreamReader sr = new StreamReader(stream))
{
using (JsonTextReader reader = new JsonTextReader(sr))
{
...
}
}
}
}
catch (Exception ReadingStreamException)
{
}
private async Task<stream> ExecuteRequestAsync(Uri uri, HttpMethod method)
{
Stream stream;
using (HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, uri))
{
try
{
stopwatch.Start();
using (HttpResponseMessage responseMessage = await this.httpClient.SendAsync(httpRequestMessage).ConfigureAwait(false))
{
stream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
}
}
catch(Exception GettingStreamException)
{
// Error checking code
}
return stream;
}
使用(StreamReader sr = new StreamReader(stream))
的行向ArgumentException類型的ReadingStreamException拋出一個異常,其詳細信息為“Stream is not readable”。 上面的代碼有問題嗎?
發生這種情況是因為當您處置HttpResponseMessage
,它會處理基礎流。 從來源 :
private HttpContent content;
protected virtual void Dispose(bool disposing)
{
if (disposing && !disposed)
{
disposed = true;
if (content != null)
{
content.Dispose();
}
}
}
您可以復制流,也可以不處理HttpResponseMessage
,因為在將其傳遞給StreamReader
時,無論如何都要處置它。 我會選擇后者:
private async Task<Stream> ExecuteRequestAsync(Uri uri, HttpMethod method)
{
Stream stream = null;
using (HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, uri))
{
try
{
stopwatch.Start();
HttpResponseMessage responseMessage = await httpClient
.SendAsync(httpRequestMessage)
.ConfigureAwait(false);
stream = await responseMessage.Content.ReadAsStreamAsync()
.ConfigureAwait(false);
}
catch(Exception GettingStreamException)
{
// Error checking code
}
}
return stream;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.