Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функции WinINet имеют простую и гибкую встроенную поддержку кэширования. Все данные, полученные из сети, кэшируются на жестком диске и извлекаются для последующих запросов. Приложение может управлять кэшированием по каждому запросу. Для http-запросов с сервера большинство полученных заголовков также кэшируются. Если HTTP-запрос удовлетворен из кэша, кэшированные заголовки также возвращаются вызывающему объекту. Это упрощает загрузку данных, независимо от того, поступает ли данные из кэша или из сети.
Приложения должны правильно выделить буфер, чтобы получить нужные результаты при использовании функций кэширования постоянных URL-адресов. Дополнительные сведения см. в разделе Использование буферов.
Поведение кэша во время обработки ответа
Кэш WinINet соответствует директивам управления кэшем HTTP, описанным в RFC 2616. Директивы управления кэшем и флаги набора приложений определяют, что может быть кэшировано; Однако WinINet определяет, что фактически кэшируется на основе следующего критерия:
- WinINet кэширует только ответы HTTP и FTP.
- Только правильно сформированные ответы могут храниться в кэше и использоваться в ответе на последующий запрос. Хорошо работающие ответы определяются как успешно возвращающиеся.
- По умолчанию WinINet будет кэшировать успешные ответы, если только директива управления кэшем с сервера или определенный приложением флаг специально указывает, что ответ не может быть кэширован.
- Как правило, ответы на команду GET кэшируются, если выполнены указанные выше требования. Ответы на команды PUT и POST не кэшируются при каких-либо обстоятельствах.
- Элементы будут кэшироваться даже при заполнении кэша. Если добавленный элемент превышает лимит размера кэша, планируется очистка кэша. По умолчанию элементы не гарантированно остаются более 10 минут в кэше. Дополнительные сведения см. в разделе "Кэш Скэвенджер" ниже.
- Https кэшируется по умолчанию. Это управляется глобальным параметром, который не может быть переопределен директивами кэша, определяемыми приложением. Чтобы переопределить глобальный параметр, выберите applet "Параметры браузера" на панели управления и перейдите на вкладку "Дополнительно". Установите флажок "Не сохранять зашифрованные страницы на диск" в разделе "Безопасность".
Кэш Scavenger
Механизм периодической очистки удаляет элементы из кэша. Если элемент добавляется в кэш, а кэш заполнен, элемент добавляется в кэш, и планируется запуск сборщика кэша. Если сборщик завершает цикл очистки и кэш не достиг предела, сборщик планируется на новый цикл при добавлении нового элемента в кэш. Как правило, программа очистки планируется, когда добавленный элемент превышает допустимый размер кэша. По умолчанию минимальное время для жизни в кэше равно 10 минут, если иное не указано в директиве управления кэшем. Когда инициируется процесс очистки кэша, нет гарантии, что самые старые элементы будут удалены первыми.
Кэш предоставляется всем приложениям WinINet на компьютере для одного пользователя. Начиная с Windows Vista и Windows Server 2008 размер кэша равен 1/32-му размеру диска с минимальным размером 8 МБ и максимальным размером 50 МБ.
Использование флагов для управления кэшированием
Флаги кэширования позволяют приложению управлять тем, когда и как он использует кэш. Эти флаги можно использовать отдельно или в сочетании с параметром dwFlags в функциях, которые обращаются к информации или ресурсам в Интернете. По умолчанию функции хранят все данные, скачанные из Интернета.
Следующие флаги можно использовать для управления кэшированием.
Ценность | Значение |
---|---|
INTERNET_FLAG_CACHE_ASYNC | Этот флаг не действует. |
INTERNET_FLAG_CACHE_IF_NET_FAIL | Возвращает ресурс из кэша, если сетевой запрос ресурса завершается сбоем из-за ошибки ERROR_INTERNET_CONNECTION_RESET или ERROR_INTERNET_CANNOT_CONNECT. Этот флаг используется в HttpOpenRequest. |
INTERNET_FLAG_DONT_CACHE (флаг не кэшировать в интернете) | Не кэширует данные локально или в каких-либо шлюзах. Идентично предпочтительному значению, INTERNET_FLAG_NO_CACHE_WRITE. |
Указывает, что это отправка данных через форму. | |
INTERNET_FLAG_FROM_CACHEINTERNET_FLAG_FORMS_SUBMIT | Не выполняет сетевые запросы. Все сущности возвращаются из кэша. Если запрошенный элемент не находится в кэше, возвращается соответствующая ошибка, например ERROR_FILE_NOT_FOUND. Только функция InternetOpen использует этот флаг. |
INTERNET_FLAG_FWD_BACK | Указывает, что функция должна использовать копию ресурса, который в настоящее время находится в кэше Интернета. Дата окончания срока действия и другие сведения о ресурсе не проверяются. Если запрошенный элемент не найден в кэше Интернета, система пытается найти ресурс в сети. Это значение было введено в Microsoft Internet Explorer 5 и связано с операциями кнопок "Вперед" и "Назад" в Internet Explorer. |
INTERNET_FLAG_HYPERLINK | Заставляет приложение перезагрузить ресурс, если при сохранении ресурса в кэше не было возвращено время истечения или время последнего изменения. |
INTERNET_FLAG_MAKE_PERSISTENT | Больше не поддерживается. |
ФЛАГ_ИНТЕРНЕТ_ДОЛЖЕН_КЭШИРОВАТЬ_ЗАПРОС | Вызывает создание временного файла, если файл не может быть кэширован. Это идентично предпочтительному значению, INTERNET_FLAG_NEED_FILE. |
INTERNET_FLAG_NEED_FILE | Вызывает создание временного файла, если файл не может быть кэширован. |
INTERNET_FLAG_NO_CACHE_WRITE | Отклоняет любую попытку функции хранить данные, скачанные из Интернета в кэше. Этот флаг необходим, если приложение не хочет хранить скачанные ресурсы локально. |
INTERNET_FLAG_NO_UI | Отключает диалоговое окно cookie. Этот флаг можно использовать httpOpenRequest и InternetOpenUrl (только HTTP-запросы). |
INTERNET_FLAG_OFFLINE | Запрещает приложению отправлять запросы в сеть. Все запросы разрешаются с помощью ресурсов, хранящихся в кэше. Если ресурс не находится в кэше, возвращается соответствующая ошибка, например ERROR_FILE_NOT_FOUND. |
INTERNET_FLAG_PRAGMA_NOCACHE | Принуждает сервер-источник обрабатывать запрос, даже если имеется кэшированная копия на прокси. Функция InternetOpenUrl (только для запросов HTTP и HTTPS) и функция HttpOpenRequest использует этот флаг. |
INTERNET_FLAG_RELOAD | Принудительно заставляет функцию извлекать запрошенный ресурс непосредственно из Интернета. Скачанные сведения хранятся в кэше. |
INTERNET_FLAG_RESYNCHRONIZE | Приводит к тому, что приложение выполняет условное скачивание ресурса из Интернета. Если версия, хранящаяся в кэше, актуальна, то информация загружается из кэша. В противном случае данные загружаются с сервера. |
Функции постоянного кэширования
Клиенты, которым требуются службы постоянного кэширования, используют функции постоянного кэширования, чтобы разрешить приложениям сохранять данные в локальной файловой системе для последующего использования, например в ситуациях, когда канал низкой пропускной способности ограничивает доступ к данным или доступ недоступен вообще.
Функции кэша обеспечивают постоянное кэширование и автономный просмотр. Если флаг INTERNET_FLAG_NO_CACHE_WRITE явно не указывает отсутствие кэширования, функции кэшируют все данные, загруженные из сети. Ответы на данные POST не кэшируются.
Использование функций кэша постоянных URL-адресов
Следующие функции кэша постоянных URL-адресов позволяют приложению получать доступ к информации, хранящейся в кэше, и управлять ими.
Функция | Описание |
---|---|
CommitUrlCacheEntryA | Кэширует данные в указанном файле в хранилище кэша и связывает его с заданным URL-адресом. |
CommitUrlCacheEntryW | Кэширует данные в указанном файле в хранилище кэша и связывает его с заданным URL-адресом. |
CreateUrlCacheEntry | Выделяет запрошенное хранилище кэша и создает локальное имя файла для сохранения записи кэша, соответствующей имени источника. |
CreateUrlCacheGroup | Создает идентификацию группы кэша. |
DeleteUrlCacheEntry | Удаляет файл, связанный с именем источника из кэша, если файл существует. |
DeleteUrlCacheGroup | Освобождает GROUPID и любое связанное состояние в файле индекса кэша. |
FindCloseUrlCache | Закрывает указанный дескриптор перечисления. |
FindFirstUrlCacheEntry | Начинает перечисление кэша. |
FindFirstUrlCacheEntryEx | Начинает отфильтрованное перечисление кэша. |
FindNextUrlCacheEntry | Извлекает следующую запись в кэше. |
FindNextUrlCacheEntryEx | Извлекает следующую запись в перечислении отфильтрованного кэша. |
GetUrlCacheEntryInfo | Извлекает сведения о записи кэша. |
GetUrlCacheEntryInfoEx | Выполняет поиск URL-адреса после перевода любых кэшированных перенаправлений, которые будут применены в автономном режиме, HttpSendRequest. |
ReadUrlCacheEntryStream | Считывает кэшированные данные из потока, который был открыт с помощью RetrieveUrlCacheEntryStream. |
RetrieveUrlCacheEntryFile | Извлекает запись кэша из кэша в виде файла. |
RetrieveUrlCacheEntryStream | Обеспечивает наиболее эффективный и независимый от реализации способ доступа к данным кэша. |
SetUrlCacheEntryGroup | Добавляет или удаляет записи из группы кэша. |
SetUrlCacheEntryInfo | Задает указанные элементы структуры INTERNET_CACHE_ENTRY_INFO. |
UnlockUrlCacheEntryFile | Разблокирует запись кэша, заблокированную при извлечении файла для использования из кэша с помощью RetrieveUrlCacheEntryFile. |
UnlockUrlCacheEntryStream | Закрывает поток, полученный с помощью 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, чтобы закрыть дескриптор перечисления кэша.
В следующем примере отображается URL-адрес каждой записи кэша в поле списка IDC_CacheList. Он использует MAX_CACHE_ENTRY_INFO_SIZE для первоначального выделения буфера, так как ранние версии API WinINet не перечисляют кэш должным образом. Более поздние версии выполняют правильное перечисление кэша и нет ограничения размера кэша. Все приложения, выполняемые на компьютерах с версией API WinINet из Internet Explorer 4.0, должны выделить буфер требуемого размера. Дополнительные сведения см. в разделе Использование буферов.
int WINAPI EnumerateCacheOld(HWND hX)
{
DWORD dwEntrySize;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;
DWORD MAX_CACHE_ENTRY_INFO_SIZE = 4096;
HANDLE hCacheDir;
int nCount=0;
SendDlgItemMessage(hX,IDC_CacheList,LB_RESETCONTENT,0,0);
SetCursor(LoadCursor(NULL,IDC_WAIT));
dwEntrySize = MAX_CACHE_ENTRY_INFO_SIZE;
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;
again:
hCacheDir = FindFirstUrlCacheEntry(NULL,
lpCacheEntry,
&dwEntrySize);
if (!hCacheDir)
{
delete[]lpCacheEntry;
switch(GetLastError())
{
case ERROR_NO_MORE_ITEMS:
TCHAR tempout[80];
_stprintf_s(tempout,
80,
TEXT("The number of cache entries = %d \n"),
nCount);
MessageBox(hX,tempout,TEXT("Cache Enumeration"),MB_OK);
FindCloseUrlCache(hCacheDir);
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
break;
case ERROR_INSUFFICIENT_BUFFER:
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO)
new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;
goto again;
break;
default:
ErrorOut( hX,GetLastError(),
TEXT("FindNextUrlCacheEntry Init"));
FindCloseUrlCache(hCacheDir);
SetCursor(LoadCursor(NULL,IDC_ARROW));
return FALSE;
}
}
SendDlgItemMessage(hX,IDC_CacheList,LB_ADDSTRING,
0,(LPARAM)(lpCacheEntry->lpszSourceUrlName));
nCount++;
delete (lpCacheEntry);
do
{
dwEntrySize = MAX_CACHE_ENTRY_INFO_SIZE;
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;
retry:
if (!FindNextUrlCacheEntry(hCacheDir,
lpCacheEntry,
&dwEntrySize))
{
delete[]lpCacheEntry;
switch(GetLastError())
{
case ERROR_NO_MORE_ITEMS:
TCHAR tempout[80];
_stprintf_s(tempout,
80,
TEXT("The number of cache entries = %d \n"),nCount);
MessageBox(hX,
tempout,
TEXT("Cache Enumeration"),MB_OK);
FindCloseUrlCache(hCacheDir);
return TRUE;
break;
case ERROR_INSUFFICIENT_BUFFER:
lpCacheEntry =
(LPINTERNET_CACHE_ENTRY_INFO)
new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;
goto retry;
break;
default:
ErrorOut(hX,
GetLastError(),
TEXT("FindNextUrlCacheEntry Init"));
FindCloseUrlCache(hCacheDir);
return FALSE;
}
}
SendDlgItemMessage(hX,
IDC_CacheList,LB_ADDSTRING,
0,
(LPARAM)(lpCacheEntry->lpszSourceUrlName));
nCount++;
delete[] lpCacheEntry;
} while (TRUE);
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
}
Получение сведений о записи кэша
Функция GetUrlCacheEntryInfo позволяет получить структуру INTERNET_CACHE_ENTRY_INFO для указанного URL-адреса. Эта структура содержит размер структуры, URL-адрес кэшированных данных, имя локального файла, тип записи кэша, количество попаданий, размер, время последнего изменения, срок действия, последний доступ, время последней синхронизации, сведения о заголовке, размер сведений о заголовке и расширение имени файла.
GetUrlCacheEntryInfo принимает URL-адрес, буфер для структуры INTERNET_CACHE_ENTRY_INFO и размер буфера. Если URL-адрес найден, данные копируются в буфер. В противном случае функция завершается ошибкой и GetLastError возвращает ERROR_FILE_NOT_FOUND. Если размер буфера недостаточно для хранения сведений о записи кэша, функция завершается ошибкой и GetLastError возвращает ERROR_INSUFFICIENT_BUFFER. Размер, необходимый для получения сведений, хранится в переменной размера буфера.
GetUrlCacheEntryInfo не выполняет синтаксический анализ URL-адресов, поэтому URL-адрес, содержащий привязку (#), не будет найден в кэше, даже если ресурс кэшируется. Например, если URL-адрес "https://example.com/example.htm#sample" передается, функция возвращает ERROR_FILE_NOT_FOUND даже если "https://example.com/example.htm" находится в кэше.
В следующем примере извлекаются сведения о записи кэша для указанного URL-адреса. Затем функция отображает сведения о заголовке в поле редактирования IDC_CacheDump.
int WINAPI GetCacheEntryInfo(HWND hX,LPTSTR lpszUrl)
{
DWORD dwEntrySize=0;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;
SetCursor(LoadCursor(NULL,IDC_WAIT));
if (!GetUrlCacheEntryInfo(lpszUrl,NULL,&dwEntrySize))
{
if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
{
ErrorOut(hX,GetLastError(),TEXT("GetUrlCacheEntryInfo"));
SetCursor(LoadCursor(NULL,IDC_ARROW));
return FALSE;
}
else
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO)
new char[dwEntrySize];
}
else
return FALSE; // should not be successful w/ NULL buffer
// and 0 size
if (!GetUrlCacheEntryInfo(lpszUrl,lpCacheEntry,&dwEntrySize))
{
ErrorOut(hX,GetLastError(),TEXT("GetUrlCacheEntryInfo"));
SetCursor(LoadCursor(NULL,IDC_ARROW));
return FALSE;
}
else
{
if ((lpCacheEntry->dwHeaderInfoSize)!=0)
{
LPSTR(lpCacheEntry->lpHeaderInfo)
[lpCacheEntry->dwHeaderInfoSize]=TEXT('\0');
SetDlgItemText(hX,IDC_Headers,
lpCacheEntry->lpHeaderInfo);
}
else
{
SetDlgItemText(hX,IDC_Headers,TEXT("None"));
}
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
}
}
Создание записи кэша
Приложение использует функции CreateUrlCacheEntry и CommitUrlCacheEntry для создания записи кэша.
CreateUrlCacheEntry принимает URL-адрес, ожидаемый размер файла и расширение имени файла. Затем функция создает локальное имя файла для сохранения записи кэша, соответствующей расширению URL-адреса и имени файла.
Используя имя локального файла, запишите данные в локальный файл. После записи данных в локальный файл приложение должно вызвать CommitUrlCacheEntry.
CommitUrlCacheEntry принимает URL-адрес, имя локального файла, срок действия, время последнего изменения, тип записи кэша, сведения о заголовке, размер сведений о заголовке и расширение имени файла. Затем функция кэширует данные в файле, указанном в хранилище кэша, и связывает его с заданным URL-адресом.
В следующем примере используется локальное имя файла, созданное предыдущим вызовом CreateUrlCacheEntry, хранящимся в текстовом поле IDC_LocalFile, для хранения текста из текстового поля IDC_CacheDumpв записи кэша. После записи данных в файл с помощью fopen, fprintfи fcloseзапись фиксируется с помощью CommitUrlCacheEntry.
int WINAPI CommitEntry(HWND hX)
{
LPTSTR lpszUrl, lpszExt, lpszFileName;
LPTSTR lpszData,lpszSize;
DWORD dwSize;
DWORD dwEntryType=0;
FILE *lpfCacheEntry;
LPFILETIME lpdtmExpire, lpdtmLastModified;
LPSYSTEMTIME lpdtmSysTime;
errno_t err;
if( SendDlgItemMessage(hX,IDC_RBNormal,BM_GETCHECK,0,0) )
{
dwEntryType = dwEntryType + NORMAL_CACHE_ENTRY;
}
else if( SendDlgItemMessage(hX,IDC_RBSticky, BM_GETCHECK,0,0) )
{
dwEntryType = dwEntryType + STICKY_CACHE_ENTRY;
}
else if(SendDlgItemMessage( hX,IDC_RBSparse, BM_GETCHECK,0,0) )
{
dwEntryType = dwEntryType + SPARSE_CACHE_ENTRY;
}
if( SendDlgItemMessage(hX,IDC_RBCookie, BM_GETCHECK,0,0))
{
dwEntryType = dwEntryType + COOKIE_CACHE_ENTRY;
}
else if( SendDlgItemMessage(hX,IDC_RBUrl, BM_GETCHECK,0,0) )
{
dwEntryType = dwEntryType + URLHISTORY_CACHE_ENTRY;
}
if( SendDlgItemMessage(hX,IDC_RBNone, BM_GETCHECK,0,0) )
{
dwEntryType=0;
}
lpdtmSysTime = new SYSTEMTIME;
lpdtmExpire = new FILETIME;
lpdtmLastModified = new FILETIME;
GetLocalTime(lpdtmSysTime);
SystemTimeToFileTime(lpdtmSysTime,lpdtmExpire);
SystemTimeToFileTime(lpdtmSysTime,lpdtmLastModified);
delete(lpdtmSysTime);
lpszUrl = new TCHAR[MAX_PATH];
lpszFileName = new TCHAR[MAX_PATH];
lpszExt = new TCHAR[5];
lpszSize = new TCHAR[10];
GetDlgItemText(hX,IDC_SourceURL,lpszUrl,MAX_PATH);
GetDlgItemText(hX,IDC_LocalFile,lpszFileName,MAX_PATH);
GetDlgItemText(hX,IDC_FileExt,lpszExt,5);
GetDlgItemText(hX,IDC_SizeLow,lpszSize,10);
dwSize = (DWORD)_ttol(lpszSize);
delete(lpszSize);
if (dwSize==0)
{
if((MessageBox(hX,
TEXT("Incorrect File Size.\nUsing 8000 characters, Okay?\n"),
TEXT("Commit Entry"),MB_YESNO))
==IDYES)
{
dwSize = 8000;
}
else
{
return FALSE;
}
}
lpszData = new TCHAR[dwSize];
GetDlgItemText(hX,IDC_CacheDump,lpszData,dwSize);
err = _tfopen_s(&lpfCacheEntry,lpszFileName,_T("w"));
if (err)
return FALSE;
fprintf(lpfCacheEntry,"%s",lpszData);
fclose(lpfCacheEntry);
delete(lpszData);
if ( !CommitUrlCacheEntry( lpszUrl,
lpszFileName,
*lpdtmExpire,
*lpdtmLastModified,
dwEntryType,
NULL,
0,
lpszExt,
0) )
{
ErrorOut(hX,GetLastError(),TEXT("Commit Cache Entry"));
delete(lpszUrl);
delete(lpszFileName);
delete(lpszExt);
delete(lpdtmExpire);
delete(lpdtmLastModified);
return FALSE;
}
else
{
delete(lpszUrl);
delete(lpszFileName);
delete(lpszExt);
delete(lpdtmExpire);
delete(lpdtmLastModified);
return TRUE;
}
}
Удаление записи кэша
Функция DeleteUrlCacheEntry принимает URL-адрес и удаляет файл кэша, связанный с ним. Если файл кэша не существует, функция завершается ошибкой и GetLastError возвращает ERROR_FILE_NOT_FOUND. Если файл кэша заблокирован или используется, функция завершается ошибкой и GetLastError возвращает ERROR_ACCESS_DENIED. Файл удаляется при разблокировке.
Получение файлов записи кэша
Для приложений, которым требуется имя файла ресурса, используйте функции RetrieveUrlCacheEntryFile и UnlockUrlCacheEntryFile. Приложения, которые не требуют имени файла, должны использовать функции RetrieveUrlCacheEntryStream, ReadUrlCacheEntryStreamи функции UnlockUrlCacheEntryStream для получения сведений в кэше.
RetrieveUrlCacheEntryStream не выполняет синтаксический анализ URL-адресов, поэтому URL-адрес, содержащий привязку (#), не будет найден в кэше, даже если ресурс кэшируется. Например, если URL-адрес "https://example.com/example.htm#sample" передается, функция возвращает ERROR_FILE_NOT_FOUND даже если "https://example.com/example.htm" находится в кэше.
RetrieveUrlCacheEntryFile принимает URL-адрес, буфер, который хранит структуру INTERNET_CACHE_ENTRY_INFO и размер буфера. Функция извлекается и заблокирована для вызывающего абонента.
После использования сведений в файле приложение должно вызвать UnlockUrlCacheEntryFile для разблокировки файла.
Группы кэша
Чтобы создать группу кэша, необходимо вызвать функцию CreateUrlCacheGroup, чтобы сгенерировать GROUPID для группы кэша. Записи можно добавить в группу кэша, указав URL-адрес записи кэша и флаг INTERNET_CACHE_GROUP_ADD в функциюSetUrlCacheEntryGroup. Чтобы удалить запись кэша из группы, передайте URL-адрес записи кэша и флаг INTERNET_CACHE_GROUP_REMOVE в SetUrlCacheEntryGroup.
Функции FindFirstUrlCacheEntryEx и Функции FindNextUrlCacheEntryEx можно использовать для перечисления записей в указанной группе кэша. После завершения перечисления функция должна вызывать FindCloseUrlCache.
Обработка структур переменного размера
Кэш может содержать информацию переменного размера для каждого сохраненного URL-адреса. Это отражается в структуре INTERNET_CACHE_ENTRY_INFO. Когда функции кэша возвращают эту структуру, они создают буфер, который всегда имеет размер INTERNET_CACHE_ENTRY_INFO плюс любые сведения о размере переменной. Если элемент указателя не null, он указывает на область памяти сразу после структуры. При копировании буфера, возвращаемого функцией в другой буфер, элементы указателя должны быть исправлены, чтобы указать соответствующее место в новом буфере, как показано в следующем примере.
lpDstCEInfo->lpszSourceUrlName =
(LPINTERNET_CACHE_ENTRY_INFO) ((LPBYTE) lpSrcCEInfo +
((DWORD)(lpOldCEInfo->lpszSourceUrlName) - (DWORD)lpOldCEInfo));
Некоторые функции кэша завершаются ошибкой с сообщением об ошибке ERROR_INSUFFICIENT_BUFFER, если указать буфер, который слишком мал, чтобы содержать сведения о записи кэша, полученные функцией. В этом случае функция также возвращает требуемый размер буфера. Затем можно выделить буфер соответствующего размера и снова вызвать функцию.
Заметка
WinINet не поддерживает серверные реализации. Кроме того, его не следует использовать из службы. Для реализации или служб сервера microsoft Windows HTTP Services (WinHTTP).