我有一个简单的C#系统托盘应用程序,它使用 System.Net.WebClient
下载几个文件,每个文件的范围为3-15MB . WebClient正在通过HTTPS下载,我控制从中进行下载的服务器 . 文件通过直接路径从Web浏览器下载得很好,WebClient完全能够处理来自此服务器的 .DownloadString()
方法(即,将短文本文件下载到字符串) .
奇怪的是,在24小时内发生了三件事情,我怀疑某种机器特定的配置或缓存,但我想知道其他人可能知道的内容可能会让他们冒险猜测:
-
开发机器#1在调试模式下运行此代码并下载文件(称为MegabyteFile1和MegabyteFile2)直到星期五都没有问题 . 下载花了3-5秒,最多 .
-
突然,开发机器#1在周五下午停止下载MegabyteFile1 . 行为如下:
-
WebClient.DownloadFile()
无限期挂起 -
targetFileFullPath
处的文件已创建,但有0个字节 . -
主线程无限期地阻塞 .
-
必须退出申请 .
-
具有相同操作系统配置的其他开发机器运行代码就可以正常下载并成功下载 .
-
在DeveloperMachine1上使用Chrome或Internet Explorer手动下载这些文件的工作正常,有或没有查询参数 .
-
如果Fiddler正在运行,DevelopmentMachine1将下载该文件(即使没有安装Fiddler HTTPS证书冒充者) . 换句话说,如果我试图在这台机器上嗅探电线,一切正常 .
下载代码的相关部分如下:
using (WebClient client2 = new WebClient())
{
client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}
我在这个盒子上尝试了常用的sysadmin东西:重新启动它,清除Internet Explorer缓存和临时目录等 .
我知道我需要改变处理挂起下载的策略,因为我不相信我会理解造成这种特殊故障模式的原因 . 任何人都对 WebClient
中发生的事情了解得足以猜测为什么这台机器是"special"?
谢谢! -詹姆士
3 回答
遇到同样的问题,但找到了另一种解决方案 . 这里相当复杂的讨论:http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum=ncl
简而言之,问题是Web客户端正在搜索代理服务器并挂起应用程序 . 以下解决方案有助于:
在屏幕上敲了几个小时后,我和Fiddler进行了一次愉快的 Session ,并找到了答案 . 在这里分享以防其他人有同样的问题 .
事实证明,如果
WebResponse
对象没有正确地使用WebResponse
,则任何使用HttpWebRequest
先前都会导致此行为 . 无论您是创建多个WebClient
还是HttpWebRequest
对象 . 他们都会失败 .线索来自以下观察:在WireShark中观察TCP来回,很明显没有任何东西被发送到服务器以获得第二个请求(失败的那个) . 为什么这与Fiddler一起运行但不是在它不运行时?我怀疑Fiddler是"playing nice"并强行关闭连接 .
我遇到了类似的问题,当某些Web请求发生之前,WebClient.DownloadFile会超时 . 在无效地搜索未正确关闭的Web请求响应(Using this method)之后,我遇到了ServicePointManager.DefaultConnectionLimit属性 . 在我的应用程序开始时将它设置得更高解决了我的问题,如下所示:
ServicePointManager.DefaultConnectionLimit = 20