【问题标题】:Whats the difference between HttpClient.Timeout and using the WebRequestHandler timeout properties?HttpClient.Timeout 和使用 WebRequestHandler 超时属性有什么区别?
【发布时间】:2014-12-06 10:26:25
【问题描述】:

我可以直接用HttpClient.Timeout 设置我的HttpClient 对象的超时,但我最近读到了WebRequestHandler 类,它是HttpClientHandler 的派生类。

WebRequestHandler 有一个ReadWriteTimeout 属性。与HttpClient.Timeout 一起使用时,这将如何影响请求的操作?

【问题讨论】:

    标签: c# .net vb.net timeout dotnet-httpclient


    【解决方案1】:

    当您执行SendAsync 时,HttpClient.Timeout 被放置在CancellationTokenSource 上。这意味着此超时适用于整个异步操作。

    另一方面,WebRequestHandler.ReadWriteTimeout 被复制到HttpWebRequest,它在ReadTimeoutWriteTimeout 的请求流上设置。所以这更像是流级别的超时,最终是套接字级别的超时。

    如果您同时设置两者,那么如果操作的总时间超过HttpClient.Timeout,它将超时,如果从流中读取或写入的时间超过WebRequestHandler.ReadWriteTimeout,它也会超时。虽然我不确定引发的超时异常是否有所不同。

    【讨论】:

    • 既然和stream有关,那么ReadWriteTimeout会影响Response.Content.ReadAsStringAsync吗?目前我在调用SendAsync 时使用HttpCompletionOption.ResponseContentRead 以确保在超时之前读取内容,因为ReadAsStringAsync 不允许显式超时或取消。如果WebRequestHandler 允许我设置读取内容流的超时时间,我想改用HttpCompletionOption.ResponseHeadersRead
    • 从描述中描绘你的用例有点困难,你可以通过编辑问题发布相关代码吗?
    【解决方案2】:

    WebRequestHandler.ReadWriteTimeout - 在向服务器写入请求或从服务器读取响应时获取或设置超时(以毫秒为单位)。

    HttpClient.Timeout - 获取或设置TimeSpan 在请求超时之前等待。

    这里,WebRequestHandlerHTTPClient 的包装器 WebRequestHandler 派生自 HttpClientHandler,但添加了通常仅在完整 .NET 上可用的属性。 总而言之,它更多的是在更少的同一件事上。

    有关更多信息,请参阅此链接 - http://blogs.msdn.com/b/henrikn/archive/2012/08/07/httpclient-httpclienthandler-and-httpwebrequesthandler.aspx

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2011-10-18
      相关资源
      最近更新 更多