上传时webclient超时

Posted

技术标签:

【中文标题】上传时webclient超时【英文标题】:webclient timeout while uploading 【发布时间】:2012-03-03 05:09:32 【问题描述】:

我知道 WebClient 没有超时属性。我四处搜索,发现不同的代码,您可以在其中从 httpwebrequest 继承 webclient 并设置超时例如:

   class MyWebClient : WebClient

    protected override WebRequest GetWebRequest(Uri address)
    
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        
            (request as HttpWebRequest).KeepAlive = false;
            (request as HttpWebRequest).Timeout = 25000; //(tried different values)
        
        return request;
    

但这里似乎没有任何效果。超时恰好在 100 秒后发生。我正在尝试通过我制作的这个客户端应用程序上传大文件。 php 在服务器端运行,所有超时/最大上传值都已设置。

异常信息是:

the request was aborted the request was canceled

请帮帮我。

【问题讨论】:

如果 keepalive 是真的,你会遇到同样的问题。 False 可以向服务器发送连接关闭头 【参考方案1】:

另一个答案中的代码对我有用,我只将第 9 行更改为:

((HttpWebRequest)request).Timeout = System.Threading.Timeout.Infinite;

【讨论】:

(<value> as <type>).<something> 是一个非常糟糕的做法;如果<value> 不是<type> 类型,它将抛出NullReferenceException,这在诊断问题时根本没有帮助。改用直接转换:((HttpWebRequest)request).Timeout【参考方案2】:

httpWebRequest 的默认值为 100 秒,因此在代码中没有正确设置。

你试过设置.KeepAlive = true;

MSDN 表示设置为 false 即可

使用 HTTP/1.1 时,默认情况下启用 Keep-Alive。将 KeepAlive 设置为 false 可能会导致向服务器发送 Connection: Close 标头。

这是有道理的,因为您似乎正确设置了超时。你可以仔细检查here

This SO 问题也有一个答案,将错误消息链接到 keep alive 属性。

【讨论】:

以上是关于上传时webclient超时的主要内容,如果未能解决你的问题,请参考以下文章

c#webclient downloaddata方法超时

Spring Boot WebClient OAuth - 同时命中多个请求时超时

为啥 WebFlux-WebClient 超时不起作用?

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

Spring5 WebClient的超时负载均衡异常重试

从 WebClient 流式传输到 Flux。阻塞超时抛出异常