我有一个简单的C#系统托盘应用程序,用于System.Net.WebClient下载多个文件,每个文件的范围为3-15MB.WebClient正在通过HTTPS下载,我控制从中进行下载的服务器.文件通过直接路径从Web浏览器下载得很好,WebClient完全能够处理.DownloadString()来自此服务器的方法(即,将短文本文件下载到字符串).
奇怪的是,在24小时内发生了三件事,我怀疑某种特定于机器的配置或缓存,但我想知道其他人可能知道WebClient的内脏可能会让他们冒险猜测:
WebClient.DownloadFile() 无限期挂起targetFileFullPath已创建,但有0个字节.下载代码的相关部分如下:
using (WebClient client2 = new WebClient())
{
client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}
Run Code Online (Sandbox Code Playgroud)
我在这个盒子上尝试过通常的sysadmin东西:重新启动它,清除Internet Explorer缓存和临时目录等.
我知道我需要改变处理挂起下载的策略,因为我相信现实世界中会有下载.但是,如果我不明白导致这种特殊故障模式的原因,我不会想到所有的角落情况.任何人都知道发生了什么事,WebClient以便猜测为什么这台机器是"特殊的"?
谢谢!-詹姆士
遇到同样的问题,但找到了另一种解决方案.这里相当复杂的讨论:http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum= ncl
简而言之,问题是Web客户端正在搜索代理服务器并挂起应用程序.以下解决方案有助于:
WebClient webClient = new WebClient();
webClient.Proxy = null;
... Do whatever else ...
Run Code Online (Sandbox Code Playgroud)
经过几个小时在屏幕上敲击、与WireShark进行了一次愉快的会议以及与Fiddler进行了几次单独的会议后,我找到了答案。在此分享,以防其他人遇到同样的问题。
事实证明,如果对象没有正确处理,任何先验的使用HttpWebRequest都会导致这种行为。无论您是否创建多个对象。他们都会失败。WebResponse.Close()WebClientHttpWebRequest
线索来自以下观察:观察 WireShark 中来回的 TCP,很明显第二个请求(失败的请求)没有向服务器发送任何内容。为什么在 Fiddler 运行时这可以工作,但在不运行时却不行?我怀疑 Fiddler 正在“表现得很好”并强行关闭连接。