"stream was not readable" 将 ReadAsStreamAsync 与 StreamReader 一起使用时出现 ArgumentException
"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 was not readable"。上面的代码有问题吗?
发生这种情况是因为当您处理 HttpResponseMessage
时,它会处理基础流。来自 the source:
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;
}
我有以下代码使用 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 was not readable"。上面的代码有问题吗?
发生这种情况是因为当您处理 HttpResponseMessage
时,它会处理基础流。来自 the source:
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;
}