C# 如何在HttpClient.*方法中使用实际工作超时#

C# 如何在HttpClient.*方法中使用实际工作超时#,c#,http,timeout,C#,Http,Timeout,我的问题是,在C#a)中设置HttpClient的超时会中断正在运行的下载,如果设置得太低,b)在某些情况下不会触发。我正试图找到一个解决办法,需要一些帮助 我有一个非常简单的HttpClient调用实现。下载大文件时最容易看到这个问题。代码如下所示,我相信这是正确的用法: HttpClient client= new HttpClient() client.Timeout= TimeSpan.FromMinutes(1); HttpMessageRequestMessage msg= new

我的问题是,在C#a)中设置HttpClient的超时会中断正在运行的下载,如果设置得太低,b)在某些情况下不会触发。我正试图找到一个解决办法,需要一些帮助

我有一个非常简单的HttpClient调用实现。下载大文件时最容易看到这个问题。代码如下所示,我相信这是正确的用法:

HttpClient client= new HttpClient()
client.Timeout= TimeSpan.FromMinutes(1);

HttpMessageRequestMessage msg= new HttpRequestMessage(HttpMethod.Get, "<URL>");
HttpResponseMessage response= await client.SendAsync(msg, HttpCompleteOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();

await response.Content.ReadAsSytreamAsync().Result.CopyToAsync(fileStream);
HttpClient=newhttpclient()
client.Timeout=TimeSpan.frommins(1);
HttpMessageRequestMessage msg=新的HttpRequestMessage(HttpMethod.Get,“”);
HttpResponseMessage response=await client.SendAsync(消息,HttpCompleteOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
等待响应.Content.readAssyStreamAsync().Result.CopyToAsync(文件流);
现在这在原则上是可行的,但是:

  • 1分钟的超时似乎是一个“执行时间超时”,也就是说,即使文件尚未完全下载,但在该点之前下载得相当好,它也会杀死副本
  • 如果我在传输过程中拔下网络电缆(模拟灾难性故障),超时不会触发。我假设CopyToAsync中的某个.Read()方法在这种情况下只是阻塞 关于1:AFAIK客户端。超时会在内部转换为CancellationTokens(这就是抛出TaskCanceledException的原因),也就是说,它a)仅在底层操作实际检查取消时起作用,b)底层操作似乎不会在成功读取时重设计时器,因为整点似乎在设定的超时后取消

    关于2:在许多情况下,即如果服务器根本不在那里,或者如果我杀死了服务器,即如果存在客户端可以识别的“确定的网络故障”,则我会从该代码中获得适当的异常;但是我没有发现更多的“有问题的网络故障”(从(有线)服务器上拔下网络电缆,而(无线)客户端仍在尝试下载)

    现在,这是在大文件的CopyToAsync上测试的最简单方法,但我没有理由相信这在标准的GetAsync或PostAsync上有任何不同,这意味着在计时不吉利的情况下,这些方法也可能无限期挂起

    我希望HttpClient中的超时可以做的是a)只从上次成功的读/写操作开始算起(它似乎不算,从操作开始算起),b)在所有情况下都会触发,即使网络宕机(它也不算)

    那么,我能做些什么呢?我应该只使用另一个实现(哪个?),还是应该使用一个只杀死底层客户机/套接字/流的辅助线程来实现自己的超时

    谢谢