WebClient.DownloadData挂起

3
我正在尝试使用WebClient.DownloadData下载文件。通常情况下,下载是正常的,但对于某些URL,下载会卡住。
我尝试重写WebClient,并将超时设置为WebRequest,但没有帮助。
我还尝试创建WebRequest(带有超时),然后获取WebResponse,再获取流。当我读取流时,它又卡住了。
这是一个卡住的URL示例:http://www.daikodo.com/genki-back/back-img/10genki-2.jpg
有什么想法吗?

当您设置超时时,它是否已超时? - Corey Sunwold
不,那就是我的问题。我的进程一直挂起直到我杀掉它。 - sagie
你尝试过使用 Fiddler 或 Wireshark 监测缓慢的下载速度,看看发生了什么吗?例如,它是一直很慢还是快速然后突然停止。或者,启用网络跟踪可能会有所帮助。http://msdn.microsoft.com/en-us/library/hyb3xww8.aspx - Martin Smith
你能发布你的下载代码吗?从目前为止的回复来看,问题似乎更可能是你的连接而不是你的代码,但如果我们能看到你的代码,它会帮助确认这一点。 - Dan Puzey
常规用法(使用WebClient wc = new WebClient())wc.DownloadData(url);我还尝试继承WebClient并在GetWebRequest重写方法中添加超时。 - sagie
这是发生在第一个网络请求上还是需要进行一堆请求才会遇到这个问题? - Kirill Shlenskiy
3个回答

1
以下是我用来从多个服务器下载文件的代码。注意,我在响应流中设置了一个限制,因为如果我得到一个超出指定大小的文件,我不想读取全部内容。在我的应用程序中,没有 URL 应该导致文件超过这个大小;您可以省略此限制或根据需要增加此金额。
int MaxBytes = 8912; // set as needed for the max size file you expect to download
string uri = "http://your.url.here/";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = 5000; // milliseconds, adjust as needed
request.ReadWriteTimeout = 10000; // milliseconds, adjust as needed
using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        // Process the stream
        byte[] buf = new byte[1024];
        string tempString = null;
        StringBuilder sb = new StringBuilder();
        int count = 0;
        do
        {
            count = responseStream.Read(buf, 0, buf.Length);
            if (count != 0)
            {
                tempString = Encoding.ASCII.GetString(buf, 0, count);
                sb.Append(tempString);
            }
        }
        while (count > 0 && sb.Length < MaxBytes);

        responseStream.Close();
        response.Close();

        return sb.ToString();
    }
}

我不知道这是否能解决你遇到的卡顿问题,但它对我的应用程序很有效。


正如我在问题中所说的,我已经尝试过这个方法,但结果仍然相同。我正在下载的文件大小约为512K,需要大约40分钟才能下载完成。 - sagie

0

我认为这可能是你自己的问题,因为我的应用程序没有挂起。这是我的代码示例。你可以在这里发布你的代码吗?

System.Net.WebClient client = new System.Net.WebClient();
string url = @"http://www.daikodo.com/genki-back/back-img/10genki-2.jpg";
string savePath = @"C:\Temp\test.jpg";

Console.WriteLine("Downloading from: " + url);
byte[] result = client.DownloadData(url);
System.IO.File.WriteAllBytes(savePath, result);

Console.WriteLine("Download is done! It has been saved to: " + savePath);
Console.ReadKey();

下载数据需要多长时间? 我已经测试过了,我看到它正在下载数据,但需要大约40分钟。使用浏览器只需要不到一秒钟。 - sagie
我只用了几秒钟就在我的端下载了这张图片。 - schrodinger's code

0

我刚遇到了下载过程中长时间延迟的问题,原因是我添加了一个检查来验证URI是否有效。如果其他人也遇到了同样的问题,请检查您的其他网络请求,例如URI检查。


1
这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。一旦您拥有足够的声望,您还可以添加赏金以吸引更多关注此问题。 - Roman Marusyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接