【发布时间】:2013-05-26 03:50:09
【问题描述】:
我正在编写一个应用程序来管理游戏的模组/插件库。每隔一段时间,其中一个模块就有可用的更新,新版本是使用 WebClient.DownloadFileAsync() 下载的,通过读取 WebRequest 响应中的 Content-Disposition 检索文件名。
当有两个或更多更新可用时,第一个下载非常好,但是当您尝试下载第二个文件而不重新启动应用程序时,WebClient 冻结,该文件使用检索到的名称创建,但包含 0 个字节,并且 DownloadProgressChanged或触发 DownloadFileCompleted 事件。
如果我不尝试检索原始文件名,而只是在本地为它们命名,则 WebClient 不会冻结。但我需要原始文件名。
我可以做些什么来避免这个问题,同时仍然能够检索原始文件名?
private void Download(string url, string downloadDirectory)
{
WebClient wc = new WebClient();
string filename = FilenameFromURL(url);
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadComplete);
wc.DownloadFileAsync(new Uri(url), downloadDirectory + filename);
}
private string FilenameFromURL(string url)
{
return new ContentDisposition(WebRequest.Create(url).GetResponse().Headers["Content-Disposition"].ToString()).FileName;
}
private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
downloadProgressBar.Value = e.ProgressPercentage;
}
private void DownloadComplete(object sender, AsyncCompletedEventArgs e)
{
// ...
}
【问题讨论】:
-
您确定您没有在某处吞下异常吗?您是否厌倦了一些 HTTP 调试?以 Fiddler 为例?
标签: c# asynchronous download webclient filenames