Sorry,原谅我是标题党,因为正常标题根本没人看
不过,下面还是有点干货的。
坐标 HttpHelperV1.8(.Net 4.0)
1.拼写错误
447行
[C#] 纯文本查看 复制代码 #region public calss
应该改成
[C#] 纯文本查看 复制代码 #region public class
2.修改建议
大文件下载时,有不必要的性能损失
129行
[C#] 纯文本查看 复制代码 #region Html
if (ResponseByte != null && ResponseByte.Length > 0)
{
//设置编码
SetEncoding(item, result, ResponseByte);
//得到返回的HTML
result.Html = encoding.GetString(ResponseByte);
}
else
{
//没有返回任何Html代码
result.Html = string.Empty;
}
#endregion
当我们用HttpHelper下载文件的时候,会把Item.ResultType设置成ResultType.Byte,
表示请求的是文件流,当加载完成后,我们会使用到result.ResultByte,并把它保存成本地文件。
一般在这种情况下,外界并不会使用到result.Html,但V1.8代码,HttpHelper
仍旧会使用result.Html = encoding.GetString(ResponseByte);
但其实这个Html已经没有太大的意义了,因为返回内容是文件流。
如果文件流很大,经测试,这条语句还是蛮消耗资源。
所以,我斗胆以为,在文件下载的时候(ResultType.Byte)
不需要再设置result.Html了,在大文件下载场景,会有可观的性能提升。
3.关于网络文件下载进度的改进建议
使用HttpHelper下载文件时候,无法获取下载进度。
我在HttpHelper里添加进度的事件反馈通知。
通知事件大概代码:
[C#] 纯文本查看 复制代码 #region 下载进度事件
public delegate void ProcessReportedEventHandler(Object sender, ProcessReportedEventArgs e);
public event ProcessReportedEventHandler ProcessReported; //声明事件
protected virtual void OnProcessReported(ProcessReportedEventArgs e)
{
if (ProcessReported != null)
{ // 如果有对象注册
ProcessReported(this, e); // 调用所有注册对象的方法
}
}
#endregion
重新写了GetByteWithResponse代替原来的GetByte
[C#] 纯文本查看 复制代码 /// <summary>
/// 提取网页Byte
/// </summary>
/// <returns></returns>
private byte[] GetByteWithResponse()
{
byte[] ResponseByte = null;
MemoryStream _stream = new MemoryStream();
//GZIIP处理
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
{
//开始读取流并设置编码方式
_stream = GetMemoryStream(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
}
else
{
//开始读取流并设置编码方式
_stream = GetMemoryStream(response.GetResponseStream());
}
//获取Byte
ResponseByte = _stream.ToArray();
_stream.Close();
return ResponseByte;
}
/// <summary>
/// 手动控制获取流内容
/// </summary>
/// <param name="streamResponse">流</param>
private MemoryStream GetMemoryStream(Stream streamResponse)
{
MemoryStream _stream = new MemoryStream();
long totalLength = streamResponse.Length;
int Length = 25600;
Byte[] buffer = new Byte[Length];
int bytesRead = streamResponse.Read(buffer, 0, Length);
while (bytesRead > 0)
{
OnProcessReported(new ProcessReportedEventArgs((int)(_stream.Length / totalLength) * 100));
_stream.Write(buffer, 0, bytesRead);
bytesRead = streamResponse.Read(buffer, 0, Length);
}
OnProcessReported(new ProcessReportedEventArgs(100));
return _stream;
}
4.关于文件下载功能的拓展
a) 多线程下载
b) 断点续传
上述拓展功能可能加在HttpHelper外部可能更合适
但是下载进度,这个功能,我觉得放在HttpHelper里面还是很有必要的,因为外面根本获取不到进度。
|