最近被校招搞得成天刷题背题,每天和几百年没睡觉没吃饭一样,今天想缓一缓,继续搞之前的悦听小说小程序。
问题描述
1.老生常谈的,微信开发工具缓存丢失导致一些连带问题,重启工具,再不行?重启电脑
2.检验功能,web-view一切正常,转码阅读失败,发现缓存正常,初步确认是后台问题,没取到文章
3.进入.NET后台,确认是后台接口问题,检验后接口有时正常,有时出错。表现为切换网络后前几次正常,然后失败
4.打断点检查是原始html转码gbk出错,转码的内容不是中文甚至英文都是乱码,用几种方式测试了转码function,甚至对文章章节的爬取都没有出现乱码问题
5.查看小说网站源码,对比章节页面和阅读页,没发现明显的特殊声明,还学到了一些html的<meta>
配置:
参考:
html meta标签使用总结
国内环境下前端网页开发的几个“中国特色”代码
6.最后几经波折,找到了页面压缩
这个说法,好像是类似js等的压缩,也就是min.js,查看代码确实js压缩过,
但是目录页其实也是压缩处理过js的,但是目录页并未出现过乱码,暂时没找到这个页面压缩输出是不是所谓的js压缩,但就算是js压缩,也不该影响到html的效果才对,没找到这个的解释。
C#使用webclient获取搜狐网页内容的乱码问题
解决方案
第一种解决方案就是上图说的,插入如下代码后使用新的XWebClient通过HttpWebClient扩展WebClient的自解压功能,我最后用的就是这种方案
/// <summary>
/// 利用HttpWebClient的自动解压缩
/// </summary>
public class XWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
return request;
}
}
我还找到了第二种方案,手动解压缩:
/// <summary>
/// 利用gzip手动解压
/// </summary>
/// <param name="cbytes"></param>
/// <returns></returns>
public static string gzFile(byte[] cbytes)
{
using (MemoryStream dms = new MemoryStream())
{
using (MemoryStream cms = new MemoryStream(cbytes))
{
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms, System.IO.Compression.CompressionMode.Decompress))
{
byte[] bytes = new byte[1024];
int len = 0;
//读取压缩流,同时会被解压
while ((len = gzip.Read(bytes, 0, bytes.Length)) > 0)
{
dms.Write(bytes, 0, len);
}
}
}
return (Encoding.UTF8.GetString(dms.ToArray()));
}
}
后记
一上午就这么过去了,不过欣喜的是解决了问题并有很多收获,不过这里还有一个小问题,记在下一篇:
微信小程序+.NET(十七) JSON序列化对象 Newtonsoft.Json.JsonWriter 类型初始值设定项引发异常