TWebBrowser的Cache陷阱

来源:互联网 发布:python语言入门pdf下载 编辑:程序博客网 时间:2024/04/30 12:18
    最近在给银行制作一个在线交易软件的时候,使用了TWebBrowser来获得交易列表。具体过程是客户点击查询按钮后,使用TWebBrowser访问银行的一个xml页面,从而得到交易列表信息。很快的,系统制作完成了,同时经过测试,交易列表显示正常,看上去似乎可以交工了。
    在客户决定试上线的那天下午,突然发现:一开始做了一个交易,访问交易记录,嗯,一切正常;再作一个交易,访问交易记录,嗯?找不到刚刚做的交易。再作一个交易,还是这样。毫无疑问,有bug了。转过头来,看见了客户惊异的眼神,心知时间不等人啊。
    时间紧迫,赶紧查找问题,使用IE访问xml页面,有这两个交易,说明交易成功了,并且交易列表也正常的,排查代码,也没什么问题,怎么回事呢?
    再打开软件,查询交易,正常的,有这两天交易记录。再作再查询,没有新增的交易。退出软件并重新运行,交易列表又是正常的,到此,事情有点明了了,刚刚运行软件,访问这个页面,正常,再以后访问这个页面结果都是第一次访问的结果。难道,这就是传说中的IE Cache功能?

    问题找到了,在同个进程中使用TWebBrowser访问同一个URL,会使用IE的Cache功能,现在就看怎么解决。有两个方法:一是使用控件属性或者方法控制IE浏览页面时禁止Cache功能。新建一个工程,放了TWebBrowser、TWebBrowserEx、TEmbeddedWB几个控件,一一设置属性,测试。没有任何效果,IE的Cache功能像挥之不去的噩梦一般展现出惊人的毅力。
    没有多余的时间去慢慢研究了,只有试试另一个方法,那就是在TWebBrowser浏览页面之前,先清空该页面的Cache,毫无疑问,该是使用API的时候了,打开msdn,搜索Cache,上下看了几遍,瞄准了DeleteUrlCacheEntry这个函数。
    看看它的定义:BOOL DeleteUrlCacheEntry(LPCTSTR lpszUrlName);
    再看看说明:Removes the file associated with the source name from the cache, if the file exists.
    不错,正是它,还好,从98到xp全支持,马上在TWebBrowser的Navigate函数前加上DeleteUrlCacheEntry调用,千万别忘了加上WinInet单元引用。测试,OK,正常了。

    回头看看,IE本来很8错的Cache功能却带了一个小小的陷阱,而这个陷阱的解决却或多或少有点运气的成分,可是天知道还有多少这样的“陷阱”在等着我们。
原创粉丝点击