首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在读取时处理InvalidOperationException对象时使用HttpContent

在读取时处理InvalidOperationException对象时使用HttpContent
EN

Stack Overflow用户
提问于 2014-12-02 21:39:33
回答 1查看 217关注 0票数 1

首先,我使用Stephen的WithCancellation扩展来中止ReadStringAsync方法。在内部,这使用TaskCompletionSourceTasks.WhenAny。这里的详细信息;http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx

由于Using关键字,异常将被抛出。当End Using被击中时,读取仍在进行,这将处理Response.Content对象的内部流。我知道read仍然在后台运行,只要我的代码能够继续运行,而不需要长时间阅读,我也不介意。

在进行这种读取时,我不确定HttpClient的超时属性是否适用(请求是用HttpCompletionOption.ResponseHeadersRead发出的,所以在读取之前我没有内容)。此外,由于代理错误,我可能遇到了代码卡在读取上的问题,所以我需要能够取消它。

我不明白的是;

  1. 为什么这个异常没有被我的try/catch块捕获?
  2. 我如何解决这个问题,这样我就可以中止读取并忽略异常。

无法删除Using块,因为所有HttpReponseMessage对象都包装在Using中,所以当HttpResponseMessage被释放时,我也会遇到同样的问题。

代码语言:javascript
复制
  Public Async Function GetResponseStringAsync(Response As HttpResponseMessage) As Tasks.Task(Of String)

    Dim TimeoutToken As New CancellationTokenSource
    TimeoutToken.CancelAfter(DefaultTimeout)

    Try

      Using Response.Content
        Try
          Return Await Response.Content.ReadAsStringAsync.WithCancellation(TimeoutToken.Token).ConfigureAwait(False)
        Catch ex As Exception
        End Try
      End Using
    Catch ex As Exception

    End Try

    Return Nothing
  End Function

这是抛出的InvalidOperationException的输出。

代码语言:javascript
复制
System.InvalidOperationException: Can not access a closed Stream.
   at System.Net.GZipWrapperStream.EndRead(IAsyncResult asyncResult)
   at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.EndRead(IAsyncResult asyncResult)
   at System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar)

编辑: 72小时后没有任何评论,向上或回答。这个问题有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-11-15 21:00:29

Response.Content.ReadAsStringAsync的调用不阻塞。它立即返回(毕竟是异步的),触发对using语句的finally子句中的内容的Dispose调用,从而关闭底层流,从而导致异常。

当尝试读取时,流已经关闭。若要在读取后释放内容,可以使用如下所示的延续:

代码语言:javascript
复制
ContinueWith(t => { response.Content.Dispose(); return t.Result; });

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27259488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档