webClient 是 System.Net的一个类,用于生成HTML。
流程大致是,用DownloadFileAsync 下载文件,保存成一个临时文件,在保存成功后,调用updateHtml 方法将临时文件覆盖目标文件,但是如果下载了一个0K的文件,就会调用webrequest方法去重试。
注意:wc.Encoding 设置输出的编码,如果错了,文件里面内容会乱码的。DownloadFileAsync 方法 生成html文件,但是这里要注意的是第三个参数,这个参数是为了异步过程中传递的参数,在wc_DownloadFileCompleted 中的 e.UserState 使用,可惜官网 没有 这个方法的例子,是看了ARM后 才知道的。
using
(WebClient wc
=
new
WebClient())
... {
switch (r.Encoding)
...{
case "UTF-8":
wc.Encoding = Encoding.UTF8;
break;
case "GB2312":
wc.Encoding = Encoding.GetEncoding("gb2312");
break;
default:
break;
}
//url有效
if (!System.IO.Directory.Exists(Path.GetDirectoryName(r.savepath)))
...{
//目录不存在,自动创建
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(r.savepath));
}
string newFile = Path.Combine(Path.GetDirectoryName(r.savepath), Path.GetFileNameWithoutExtension(r.savepath) + TaskFactory.GUID + Path.GetExtension(r.savepath));
//异步
wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);
//生成页面
wc.DownloadFileAsync(new Uri(r.url), newFile, new string[] ...{ r.savepath, newFile, r.url,r.Encoding });
}
... {
switch (r.Encoding)
...{
case "UTF-8":
wc.Encoding = Encoding.UTF8;
break;
case "GB2312":
wc.Encoding = Encoding.GetEncoding("gb2312");
break;
default:
break;
}
//url有效
if (!System.IO.Directory.Exists(Path.GetDirectoryName(r.savepath)))
...{
//目录不存在,自动创建
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(r.savepath));
}
string newFile = Path.Combine(Path.GetDirectoryName(r.savepath), Path.GetFileNameWithoutExtension(r.savepath) + TaskFactory.GUID + Path.GetExtension(r.savepath));
//异步
wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);
//生成页面
wc.DownloadFileAsync(new Uri(r.url), newFile, new string[] ...{ r.savepath, newFile, r.url,r.Encoding });
}
完成时调用方法
private
static
void
wc_DownloadFileCompleted(
object
sender, System.ComponentModel.AsyncCompletedEventArgs e)
... {
string[] arr = e.UserState as string[];
//更新html
bool retry = updateHtml(arr[0], arr[1], arr[2]);
if (retry)
...{
//需要重试的,使用webrequest 去获取html
Trace.Message("重试:" + arr[2]);
try
...{
createHtmlByWebRequest(arr[0], arr[1], arr[2], arr[3]);
}
catch (Exception ex)
...{
Trace.Error(ex);
}
}
}
... {
string[] arr = e.UserState as string[];
//更新html
bool retry = updateHtml(arr[0], arr[1], arr[2]);
if (retry)
...{
//需要重试的,使用webrequest 去获取html
Trace.Message("重试:" + arr[2]);
try
...{
createHtmlByWebRequest(arr[0], arr[1], arr[2], arr[3]);
}
catch (Exception ex)
...{
Trace.Error(ex);
}
}
}