奇怪的WebClient行为:1台计算机挂起,其他计算机不挂载同一文件

jbe*_*ock 6 .net c# webclient

我有一个简单的C#系统托盘应用程序,用于System.Net.WebClient下载多个文件,每个文件的范围为3-15MB.WebClient正在通过HTTPS下载,我控制从中进行下载的服务器.文件通过直接路径从Web浏览器下载得很好,WebClient完全能够处理.DownloadString()来自此服务器的方法(即,将短文本文件下载到字符串).

奇怪的是,在24小时内发生了三件事,我怀疑某种特定于机器的配置或缓存,但我想知道其他人可能知道WebClient的内脏可能会让他们冒险猜测:

  1. 开发机器#1在调试模式下运行此代码并在星期五之前下载文件(称为MegabyteFile1和MegabyteFile2)没有问题.下载花了3-5秒,最多.
  2. 突然,开发机器#1在周五下午停止下载MegabyteFile1.行为如下:
    • WebClient.DownloadFile() 无限期挂起
    • 文件at targetFileFullPath已创建,但有0个字节.
    • 主线程无限期地阻塞.
    • 必须退出申请.
  3. 具有相同操作系统配置的其他开发机器运行代码就可以正常下载并成功下
  4. 在DeveloperMachine1上使用Chrome或Internet Explorer手动下载这些文件的工作正常,有或没有查询参数.
  5. 如果Fiddler正在运行,DevelopmentMachine1 下载该文件(即使没有安装Fiddler HTTPS证书冒充者).换句话说,如果我试图在这台机器上嗅探电线,一切正常.

下载代码的相关部分如下:

using (WebClient client2 = new WebClient())
{
  client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}
Run Code Online (Sandbox Code Playgroud)

我在这个盒子上尝试过通常的sysadmin东西:重新启动它,清除Internet Explorer缓存和临时目录等.

我知道我需要改变处理挂起下载的策略,因为我相信现实世界中会有下载.但是,如果我不明白导致这种特殊故障模式的原因,我不会想到所有的角落情况.任何人都知道发生了什么事,WebClient以便猜测为什么这台机器是"特殊的"?

谢谢!-詹姆士

Wis*_*man 7

遇到同样的问题,但找到了另一种解决方案.这里相当复杂的讨论: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)


jbe*_*ock 5

经过几个小时在屏幕上敲击、与WireShark进行了一次愉快的会议以及与Fiddler进行了几次单独的会议后,我找到了答案。在此分享,以防其他人遇到同样的问题。

事实证明,如果对象没有正确处理,任何先验的使用HttpWebRequest都会导致这种行为。无论您是否创建多个对象。他们都会失败。WebResponse.Close()WebClientHttpWebRequest

线索来自以下观察:观察 WireShark 中来回的 TCP,很明显第二个请求(失败的请求)没有向服务器发送任何内容。为什么在 Fiddler 运行时这可以工作,但在不运行时却不行?我怀疑 Fiddler 正在“表现得很好”并强行关闭连接。