我有一个简单的C#系统托盘应用程序,它使用System.Net.WebClient下载几个文件,每个文件的范围为3-15MB. WebClient正在通过HTTPS下载,我控制从中进行下载的服务器.文件通过直接路径从Web浏览器下载得很好,WebClient完全能够从该服务器处理.DownloadString()方法(即,将短文本文件下载到字符串).
@H_403_2@奇怪的是,在24小时内发生了三件事情,我怀疑某种特定于机器的配置或缓存,但我想知道其他人可能知道的关于WebClient内部的内容可能会让他们冒险猜测:
@H_403_2@>开发机器#1在调试模式下运行此代码并在周五之前下载文件(称为MegabyteFile1和MegabyteFile2)没有问题.下载花了3-5秒,最多.
>突然,开发机器#1在周五下午停止下载MegabyteFile1.行为如下: @H_403_2@> WebClient.DownloadFile()无限期挂起
> targetFileFullPath上的文件已创建,但有0个字节.
>主线程无限期地阻塞.
>必须退出申请. @H_403_2@>具有相同操作系统配置的其他开发机器可以正常运行代码并成功下载.
>在DeveloperMachine1上使用Chrome或Internet Explorer手动下载这些文件的工作正常,有或没有查询参数.
>如果Fiddler正在运行,则DevelopmentMachine1将下载该文件(即使没有安装Fiddler HTTPS证书冒充者).换句话说,如果我试图在这台机器上嗅探电线,一切正常. @H_403_2@下载代码的相关部分如下:
-詹姆士
>突然,开发机器#1在周五下午停止下载MegabyteFile1.行为如下: @H_403_2@> WebClient.DownloadFile()无限期挂起
> targetFileFullPath上的文件已创建,但有0个字节.
>主线程无限期地阻塞.
>必须退出申请. @H_403_2@>具有相同操作系统配置的其他开发机器可以正常运行代码并成功下载.
>在DeveloperMachine1上使用Chrome或Internet Explorer手动下载这些文件的工作正常,有或没有查询参数.
>如果Fiddler正在运行,则DevelopmentMachine1将下载该文件(即使没有安装Fiddler HTTPS证书冒充者).换句话说,如果我试图在这台机器上嗅探电线,一切正常. @H_403_2@下载代码的相关部分如下:
using (WebClient client2 = new WebClient()) { client2.DownloadFile(String.Format("{0}?{1}",thePath,queryParams),targetFileFullPath); }@H_403_2@我在这个盒子上尝试过通常的sysadmin东西:重新启动它,清除Internet Explorer缓存和临时目录等. @H_403_2@我知道我需要改变处理挂起下载的策略,因为我相信现实世界中会有下载.但是,如果我不明白导致这种特殊故障模式的原因,我不会想到所有的角落情况.任何人都知道WebClient中发生了什么,以便猜测为什么这台机器是“特殊的”? @H_403_2@谢谢!
-詹姆士
解决方法
遇到同样的问题,但找到了另一种解决方案.
这里相当复杂的讨论:
http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum=ncl @H_403_2@简而言之,问题是Web客户端正在搜索代理服务器并挂起应用程序.
以下解决方案有助于:
这里相当复杂的讨论:
http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum=ncl @H_403_2@简而言之,问题是Web客户端正在搜索代理服务器并挂起应用程序.
以下解决方案有助于:
WebClient webClient = new WebClient(); webClient.Proxy = null; ... Do whatever else ...