Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient是如何处理超时的?_C#_.net_Http_Networking_Httpclient - Fatal编程技术网

C# HttpClient是如何处理超时的?

C# HttpClient是如何处理超时的?,c#,.net,http,networking,httpclient,C#,.net,Http,Networking,Httpclient,因此,可以设置两个超时属性:和 第一个是整个请求/响应的超时时间,所以如果下载/上传花费的时间比这个长,我就走运了,在转移过程中被切断,没有任何问题。这显然可以通过将超时设置为无限来覆盖,但我不确定这会产生什么后果 现在,后者(ReadWriteTimeOut)——至少在我看来——应该一直传播到,它会影响请求/响应流在超时之前可以阻塞(空闲)的时间 HttpClient正在使用异步版本的方法,但如上所述: 对于异步请求,客户端应用程序负责实现自己的超时机制 根本没有解释他们想要的超时机制(网络流

因此,可以设置两个超时属性:和

第一个是整个请求/响应的超时时间,所以如果下载/上传花费的时间比这个长,我就走运了,在转移过程中被切断,没有任何问题。这显然可以通过将超时设置为无限来覆盖,但我不确定这会产生什么后果

现在,后者(ReadWriteTimeOut)——至少在我看来——应该一直传播到,它会影响请求/响应流在超时之前可以阻塞(空闲)的时间

HttpClient正在使用异步版本的方法,但如上所述:

对于异步请求,客户端应用程序负责实现自己的超时机制

根本没有解释他们想要的超时机制(网络流空闲超时?整个HTTP GET超时?等等),这让我非常困惑


所以我的问题是,HttpClient如何准确地处理网络/协议超时?我想使用HttpClient上载/下载可能较大的文件,因此我将HttpClient.TimeOut设置为无限。但我担心这样做,应用程序可能会无限期地等待服务器/网络拒绝完成的某个事件。

您的引用是针对HttpWebRequest的。但是,(仅在.NET4.5中工作)是针对HttpClient的。因此,当使用HttpClient API时,它会处理超时。然而,将其设置为无限是一种不好的做法。在这种情况下,正在使用内部超时,这将导致在大约10分钟后引发异常(如果.NET 4.5中没有更改内部超时值)

使用HttpClient下载文件时有两个选项

  • 在Get请求上使用
    HttpCompletionOption.ResponseContentRead
    (这是默认的隐式选项)。然后
    HttpClient.Timeout
    有效地应用于整个下载过程。我想当你想到无限超时时就是这样

  • 在Get请求中显式使用
    HttpCompletionOption.ResponseHeadersRead
    。然后
    HttpClient.Timeout
    仅应用于获取没有内容的头部响应。 之后,您可以自行下载内容管理超时,例如通过
    response.content.ReadAsStreamAsync()


  • 我想选择2就是你想要的。只需设置一个
    HttpClient.Timeout
    ,以便在合理的时间内从服务器获得响应,然后下载内容

    ,正如我所说,
    HttpClient
    只是
    HttpWebRequest
    的包装,因此引用是相关的。你能详细说明一下这些“内部超时”吗?我发现你们的陈述相当模糊,因为我最初的问题是关于内部细节的。另外,在将
    .Timeout
    设置为无限后,我可以轻松地将连接保持打开状态,甚至超过20分钟。HttpClient不是一个包装器,因为它与绑定到特定URL的HttpWebRequest相反,与URL无关。如果在服务器端实现特定行为,则可以保持连接打开。例如,SSE(服务器发送事件)协议就利用了它。正如您所提到的,单次调用(例如调用HttpClient.GetStringAsync())使用HttpWebRequest异步方法实现。我将检查HttpClient.Timeout的确切用法,并使用此信息更新答案。它是一个包装器,因为它只是将所有HTTP协议处理委托给HttpWebRequest。事实上,您可以将其用于多个URL并不重要
    HttpClient.Timeout
    非常无用,因为它只是在请求开始时设置一个计时器,如果整个异步操作(请求+响应)没有及时完成,它就会被取消。任何人都可以通过
    CancellationTokenSource
    +
    任务来实现。延迟
    在最抽象的层,所以它是无用的属性。问题是关于您提到的
    内部超时
    。事实上,它被用作取消令牌的超时。现在,说到以上,您已经得到了关于“HttpClient如何处理超时”问题的答案。不,我没有:
    所以我的问题是,HttpClient如何准确地处理网络/协议超时?
    。我还没有了解HttpClient、HttpWebRequest、NetworkStream和所有其他层的交互如何影响HttpClient中的最终超时机制。例如,将
    HttpClient.Timeout
    设置为无穷大是否意味着
    HttpClient
    永远不会超时?如果没有,那么HttpClient会在什么样的具体情况下超时?您是否了解有关这些超时的更多细节?@Sandepkumar除了我对下面“Leo Y”的答案的评论之外,我并没有真正了解更多细节。对于我来说,有太多的层需要反编译和遍历。我建议使用反复试验来测试您感兴趣的超时情况。好的。还有一件事,如何使用httpClient对象获取WebRequestHandler.ReadWriteTimeout?@Sandepkumar将的实例传递给
    httpClient
    的构造函数。在执行此操作之前,请将
    WebRequestHandler
    ReadWriteTimeout
    属性设置为所需的值。可能有助于解释一些事情。谢谢我学到了一些新东西:)