MSDN 2005 -> Win32 和 COM 开发 -> Networking -> Networking Protocols -> Windows Internet -> About WinINet -> Caching
缓存
WinINet函数内置有简单却灵活的缓冲支持。从网络接收到的任何数据都会缓存到硬盘中,然后在后续请求中被获取。应用程序可以控制每个请求的缓存。对于来自服务器的HTTP请求,大多数收到的头部也被缓存。当从缓存中为HTTP请求获取响应时,也会把缓存的头部数据返回给调用者。这使得数据下载对于用户是透明的,无论数据是来自缓存还是来自网络。
使用永久URL缓存函数时,应用程序必须正确地分配缓冲区以得到想要的结果,详情请参考Using Buffers。
使用标志控制缓存
应用程序可以用缓存标志控制何时和怎样使用缓存。在访问互联网中信息或者资源的函数里,可以在dwFlags参数中单独或者组合使用各个缓存标志。缺省情况下,WinINet函数会缓存从互联网下载的所有数据。
下列标志用于控制缓存:
标志 | 意义 |
不在本地或者任何网关中缓存数据,与INTERNET_FLAG_NO_CACHE_WRITE意义相同。 | |
如果从缓存返回的资源没有失效时间(expire time)和最后修改时间(last-modified)字段,强制应用程序重新载入资源。 | |
不再支持 | |
如果文件不能被缓存,则创建一个临时文件,与INTERNET_FLAG_NEED_FILE意义相同。 | |
如果文件不能被缓存,则创建一个临时文件 | |
拒绝保存从互联网下载的数据到缓存的任何企图。如果应用程序不想任何下载的资源被保存到本地,这个标志是必须的。 | |
阻止应用程序发送请求到网络中。对任何请求都以缓存中的资源进行响应。如果请求的资源不在缓存中,会返回恰当的错误,比如说,ERROR_FILE_NOT_FOUND。 | |
强制程序直接从互联网获取请求的资源。下载的信息被保存到缓存中。 | |
有条件地从互联网下载请求的资源。如果缓存中的数据就是当前版本,则使用缓存中的数据;否则,重新从服务器下载资源。 |
永久缓存函数
需要永久缓存服务的客户端可使用永久缓存函数来把数据保存到本地文件系统中供后续在数据访问受限的低带宽链路情况下,或者互联网根本不可访问的情况下使用。向永久缓存插入数据的程序会被分配一个源名称用于执行重新获取、设置和取得各种属性、删除数据等操作。
缓存函数提供永久缓存和离线浏览服务。除非用标志INTERNET_FLAG_NO_CACHE_WRITE显式指定不使用缓存,函数会缓存从网络下载的所有数据,但对POST的响应不会被缓存。
使用永久URL缓存函数
下列永久URL缓存函数允许应用程序访问和操作存储在缓存中的信息。
函数 | 描述 |
缓存存储器中某特定文件中的数据,将它与给定的URL关联起来 | |
分配请求的缓存存储器,创建本地文件名用于保存对应源名称的缓存条目 | |
生成一个缓存组标识 | |
如果缓存中存在与源名称相关的文件,删除它 | |
释放GROUPID以及缓存索引文件中任何与之相关的状态 | |
关闭指定的枚举句柄 | |
开始对缓存的枚举 | |
开始对缓存的过滤型枚举 | |
返回缓存中的下一个条目 | |
在过滤型枚举中返回下一个缓存条目 | |
获取某缓存条目的信息 | |
转换任何会被HttpSendRequest应用于离线模式的缓存重定向,然后搜索指定的URL | |
从RetrieveUrlCacheEntryStream打开的流中读取缓存数据 | |
以文件的形式从缓存中获取一个缓存条目 | |
提供最高效的、实现无关的访问缓存数据的方法 | |
向缓存组添加条目,或者从中删除条目 | |
设置INTERNET_CACHE_ENTRY_INFO结构的指定成员 | |
解锁因为使用RetrieveUrlCacheEntryFile从缓存中获取其文件用于使用而被锁定的缓存条目 | |
关闭通过RetrieveUrlCacheEntryStream获取的流 |
枚举缓存
FindFirstUrlCacheEntry和FindNextUrlCacheEntry函数可枚举缓存中存储的信息。FindFirstUrlCacheEntry使用传入的搜索模式、缓冲区及其尺寸来创建枚举句柄,并返回第一个缓存条目。FindNextUrlCacheEntry使用FindFirstUrlCacheEntry创建的句柄,一个缓冲区及其尺寸,返回下一个缓存条目。
这两个函数都在缓冲区中存入一个INTERNET_CACHE_ENTRY_INFO条目。对于各个条目,结构体的大小是不同的。如果传入的缓冲区尺寸不够大,则函数调用失败,GetLastError返回ERROR_INSUFFICIENT_BUFFER。此时缓冲区尺寸参数值会指示缓存条目所需的缓冲区尺寸,应该分配一个这么大的缓冲区,然后重新调用函数。
INTERNET_CACHE_ENTRY_INFO结构体包含结构体尺寸、缓存信息的URL、本地文件名、缓存条目类型、使用计数、命中率、尺寸、最后修改时间、失效时间、最后访问时间、最后同步时间、头部信息、头部信息尺寸和文件扩展名信息。
FindFirstUrlCacheEntry函数要求传入搜索模式和用于存储INTERNET_CACHE_ENTRY_INFO结构体的缓冲区及其尺寸。当前仅实现了默认搜索模式,它返回所有缓存条目。
缓存枚举完成后,应该用FindCloseUrlCache关闭缓存枚举句柄。
下面的例子在列表框IDC_CacheList中显示每个缓存条目的URL。例子分配大小为MAX_CACHE_ENTRY_INFO_SIZE的缓存,因为对于其他缓存大小值,较早版本的WinINet函数不能正确地枚举缓存内容。较新版本的函数没有缓存大小限制。在使用来自Internet Explorer 4.0的WinINet函数的机器上运行的程序,必须分配所需尺寸的缓冲区,详情可参考Using Buffers。
<…… 省略示例代码 ……>
获取缓存条目信息
GetUrlCacheEntryInfo函数获取指定URL的INTERNET_CACHE_ENTRY_INFO结构体。结构体包含结构体尺寸、缓存信息的URL、本地文件名、缓存条目类型、使用计数、命中率、尺寸、最后修改时间、失效时间、最后访问时间、最后同步时间、头部信息、头部信息尺寸和文件扩展名信息。
GetUrlCacheEntryInfo接受一个URL、一个用于保存INTERNET_CACHE_ENTRY_INFO结构体的缓冲区及其尺寸。如果找到了给定的URL,其信息会复制到缓冲区中。否则,函数调用失败,GetLastError返回ERROR_FILE_NOT_FOUND。如果缓冲区大小不足以保存缓存条目信息,则函数调用失败,GetLastError返回ERROR_INSUFFICIENT_BUFFER。此时缓冲区尺寸参数会指示所需要的缓冲区尺寸。
GetUrlCacheEntry不会做URL解析,所以对于含有锚定(#)的URL,即使请求的资源在缓存中,函数也会找不到。比如说,如果传入 http://example.com/example.htm#sample,即使它在缓存中,函数也会返回ERROR_FILE_NOT_FOUND。
下面是获取指定URL缓存条目信息的例子,它在IDC_CacheDump编辑框中显示条目的头部信息。
<…… 省略示例代码 ……>
创建缓存条目
使用CreateUrlCacheEntry和CommitUrlCacheEntry可以创建缓存条目。
CreateUrlCacheEntry接受URL、预期的文件尺寸和文件扩展名,创建用于保存相应缓存条目的本地文件名。可以使用这个文件名向本地文件中写入数据。数据写入完成后应该调用CommitUrlCacheEntry。
CommitUrlCacheEntry接受URL、本地文件名、失效时间、最后修改时间、缓存条目类型、头部信息及其尺寸和文件扩展名,在缓存存储器中保存文件数据,并与给定的URL关联起来。
下面的例子使用由CreateUrlCacheEntry创建的、保存在IDC_LocalFile中的文件名来将IDC_CacheDump文本框中的文本保存到缓存条目中。使用fopen、fprintf和fclose把数据写入文件后,使用CommitUrlCacheEntry提交条目。
<…… 省略示例代码 ……>
删除缓存条目
DeleteUrlCacheEntry删除与给定URL相关的缓存文件。如果没有找到相应的缓存文件,则函数调用失败,GetLastError返回ERROR_FILE_NOT_FOUND。如果缓存文件当前被锁定或者正在使用中,则函数调用失败,GetLastError返回ERROR_ACCESS_DENIED。文件解锁后会被删除。
![菊子曰](http://image.webstory.my/WebStoryLogo24.png)