Penembolokan (Windows Internet)

Fungsi WinINet memiliki dukungan penembolokan bawaan yang sederhana, namun fleksibel. Setiap data yang diambil dari jaringan di-cache pada hard disk dan diambil untuk permintaan berikutnya. Aplikasi dapat mengontrol penembolokan pada setiap permintaan. Untuk permintaan http dari server, sebagian besar header yang diterima juga di-cache. Ketika permintaan http terpenuhi dari cache, header yang di-cache juga dikembalikan ke pemanggil. Ini membuat unduhan data mulus, baik data yang berasal dari cache atau dari jaringan.

Aplikasi harus mengalokasikan buffer dengan benar untuk mendapatkan hasil yang diinginkan saat menggunakan fungsi penembolokan URL persisten. Untuk informasi selengkapnya, lihat Menggunakan Buffer.

Perilaku Cache Selama Pemrosesan Respons

Cache WinINet mematuhi direktif kontrol cache HTTP yang dijelaskan dalam RFC 2616. Arahan kontrol cache dan bendera set aplikasi menentukan apa yang mungkin di-cache; namun, WinINet menentukan apa yang sebenarnya di-cache berdasarkan kriteria berikut:

  • WinINet hanya menyimpan respons HTTP dan FTP.
  • Hanya respons yang ber perilaku baik yang dapat disimpan oleh cache dan digunakan dalam balasan ke Permintaan berikutnya. Respons yang bersifat baik didefinisikan sebagai respons yang berhasil dikembalikan.
  • Secara default, WinINet akan menyimpan respons yang berhasil kecuali direktif kontrol cache dari server, atau bendera yang ditentukan aplikasi secara khusus menunjukkan bahwa respons mungkin tidak di-cache.
  • Secara umum, respons terhadap kata kerja GET di-cache jika persyaratan yang tercantum di atas terpenuhi. Respons terhadap kata kerja PUT dan POST tidak di-cache dalam keadaan apa pun.
  • Item akan di-cache bahkan ketika cache penuh. Jika item yang ditambahkan menempatkan cache di atas batas ukuran, cache scavenger dijadwalkan. Secara default, item tidak dijamin akan tetap lebih dari 10 menit dalam cache. Untuk informasi selengkapnya, lihat bagian Cache Scavenger di bawah ini.
  • Https di-cache secara default. Ini dikelola oleh pengaturan global yang tidak dapat ditimpa oleh arahan cache yang ditentukan aplikasi. Untuk mengambil alih pengaturan global, pilih applet Opsi Internet di panel kontrol, dan buka tab tingkat lanjut. Centang kotak "Jangan simpan halaman terenkripsi ke disk" di bawah bagian "Keamanan".

Cache Scavenger

Penembolokan cache secara berkala membersihkan item dari cache. Jika item ditambahkan ke cache dan cache penuh, item ditambahkan ke cache dan cache scavenger dijadwalkan. Jika penembolokan cache menyelesaikan putaran pencacakan dan cache belum mencapai batas cache, pencakar dijadwalkan untuk putaran lain ketika item lain ditambahkan ke cache. Secara umum, pemulung dijadwalkan ketika item tambahan menempatkan cache di atas batas ukurannya. Secara default, waktu minimum untuk hidup dalam cache diatur ke 10 menit kecuali ditentukan lain dalam direktif kontrol cache. Ketika cache scavenger dimulai, tidak ada jaminan bahwa item terlama adalah yang pertama dihapus dari cache.

Cache dibagikan di semua aplikasi WinINet di komputer untuk pengguna yang sama. Dimulai dengan Windows Vista dan Windows Server 2008 ukuran cache diatur ke 1/32 ukuran disk, dengan ukuran minimum 8MB dan ukuran maksimum 50MB.

Menggunakan Bendera untuk Mengontrol Penembolokan

Bendera penembolokan memungkinkan aplikasi mengontrol kapan dan bagaimana ia menggunakan cache. Bendera ini dapat digunakan sendiri atau dalam kombinasi dengan parameter dwFlags dalam fungsi yang mengakses informasi atau sumber daya di Internet. Secara default, fungsi menyimpan semua data yang diunduh dari Internet.

Bendera berikut dapat digunakan untuk mengontrol penembolokan.

Nilai Makna
INTERNET_FLAG_CACHE_ASYNC Bendera ini tidak berpengaruh.
INTERNET_FLAG_CACHE_IF_NET_FAIL Mengembalikan sumber daya dari cache jika permintaan jaringan untuk sumber daya gagal karena kesalahan ERROR_INTERNET_CONNECTION_RESET atau ERROR_INTERNET_CANNOT_CONNECT . Bendera ini digunakan oleh HttpOpenRequest.
INTERNET_FLAG_DONT_CACHE Tidak men-cache data, baik secara lokal atau di gateway apa pun. Identik dengan nilai pilihan, INTERNET_FLAG_NO_CACHE_WRITE.
Menunjukkan bahwa ini adalah pengiriman Formulir.
INTERNET_FLAG_FORMS_SUBMIT INTERNET_FLAG_FROM_CACHE Tidak membuat permintaan jaringan. Semua entitas dikembalikan dari cache. Jika item yang diminta tidak ada di cache, kesalahan yang sesuai, seperti ERROR_FILE_NOT_FOUND, dikembalikan. Hanya fungsi InternetOpen yang menggunakan bendera ini.
INTERNET_FLAG_FWD_BACK Menunjukkan bahwa fungsi harus menggunakan salinan sumber daya yang saat ini ada di cache Internet. Tanggal kedaluwarsa dan informasi lain tentang sumber daya tidak diperiksa. Jika item yang diminta tidak ditemukan di cache Internet, sistem mencoba menemukan sumber daya pada jaringan. Nilai ini diperkenalkan di Microsoft Internet Explorer 5 dan dikaitkan dengan operasi tombol Maju dan Mundur Internet Explorer.
INTERNET_FLAG_HYPERLINK Memaksa aplikasi memuat ulang sumber daya jika tidak ada waktu kedaluwarsa dan tidak ada waktu terakhir diubah yang dikembalikan ketika sumber daya disimpan di cache.
INTERNET_FLAG_MAKE_PERSISTENT Tidak lagi didukung.
INTERNET_FLAG_MUST_CACHE_REQUEST Menyebabkan file sementara dibuat jika file tidak dapat di-cache. Ini identik dengan nilai pilihan, INTERNET_FLAG_NEED_FILE.
INTERNET_FLAG_NEED_FILE Menyebabkan file sementara dibuat jika file tidak dapat di-cache.
INTERNET_FLAG_NO_CACHE_WRITE Menolak upaya apa pun oleh fungsi untuk menyimpan data yang diunduh dari Internet di cache. Bendera ini diperlukan jika aplikasi tidak ingin sumber daya yang diunduh disimpan secara lokal.
INTERNET_FLAG_NO_UI Menonaktifkan kotak dialog cookie. Bendera ini dapat digunakan oleh HttpOpenRequest dan InternetOpenUrl (hanya permintaan HTTP).
INTERNET_FLAG_OFFLINE Mencegah aplikasi mengirim permintaan ke jaringan. Semua permintaan diselesaikan menggunakan sumber daya yang disimpan dalam cache. Jika sumber daya tidak ada di cache, kesalahan yang sesuai, seperti ERROR_FILE_NOT_FOUND, dikembalikan.
INTERNET_FLAG_PRAGMA_NOCACHE Memaksa permintaan diselesaikan oleh server asal, bahkan jika salinan cache ada di proksi. Fungsi InternetOpenUrl (hanya pada permintaan HTTP dan HTTPS) dan fungsi HttpOpenRequest menggunakan bendera ini.
INTERNET_FLAG_RELOAD Memaksa fungsi untuk mengambil sumber daya yang diminta langsung dari Internet. Informasi yang diunduh disimpan di cache.
INTERNET_FLAG_RESYNCHRONIZE Menyebabkan aplikasi melakukan pengunduhan sumber daya bersyarah dari Internet. Jika versi yang disimpan dalam cache adalah saat ini, informasi diunduh dari cache. Jika tidak, informasi dimuat ulang dari server.

 

Fungsi Penembolokan Persisten

Klien yang membutuhkan layanan penembolokan persisten menggunakan fungsi penembolokan persisten untuk memungkinkan aplikasi mereka menyimpan data dalam sistem file lokal untuk penggunaan berikutnya, seperti dalam situasi di mana tautan bandwidth rendah membatasi akses ke data, atau akses tidak tersedia sama sekali.

Fungsi cache menyediakan penembolokan persisten dan penjelajahan offline. Kecuali bendera INTERNET_FLAG_NO_CACHE_WRITE secara eksplisit tidak menentukan penembolokan, fungsi menyimpan semua data yang diunduh dari jaringan. Respons terhadap data POST tidak di-cache.

Menggunakan Fungsi Cache URL Persisten

Fungsi cache URL persisten berikut memungkinkan aplikasi untuk mengakses dan memanipulasi informasi yang disimpan dalam cache.

Fungsi Deskripsi
CommitUrlCacheEntryA Cache data dalam file yang ditentukan di penyimpanan cache dan mengaitkannya dengan URL yang diberikan.
CommitUrlCacheEntryW Cache data dalam file yang ditentukan di penyimpanan cache dan mengaitkannya dengan URL yang diberikan.
CreateUrlCacheEntry Mengalokasikan penyimpanan cache yang diminta dan membuat nama file lokal untuk menyimpan entri cache yang sesuai dengan nama sumber.
CreateUrlCacheGroup Menghasilkan identifikasi grup cache.
DeleteUrlCacheEntry Menghapus file yang terkait dengan nama sumber dari cache, jika file ada.
DeleteUrlCacheGroup Merilis GROUPID dan status terkait dalam file indeks cache.
FindCloseUrlCache Menutup handel enumerasi yang ditentukan.
FindFirstUrlCacheEntry Memulai enumerasi cache.
FindFirstUrlCacheEntryEx Memulai enumerasi cache yang difilter.
FindNextUrlCacheEntry Mengambil entri berikutnya dalam cache.
FindNextUrlCacheEntryEx Mengambil entri berikutnya dalam enumerasi cache yang difilter.
GetUrlCacheEntryInfo Mengambil informasi tentang entri cache.
GetUrlCacheEntryInfoEx Mencari URL setelah menerjemahkan pengalihan cache apa pun yang akan diterapkan dalam mode offline oleh HttpSendRequest.
ReadUrlCacheEntryStream Membaca data cache dari aliran yang telah dibuka menggunakan RetrieveUrlCacheEntryStream.
RetrieveUrlCacheEntryFile Mengambil entri cache dari cache dalam bentuk file.
RetrieveUrlCacheEntryStream Menyediakan cara paling efisien dan independen implementasi untuk mengakses data cache.
SetUrlCacheEntryGroup Menambahkan atau menghapus entri dari grup singgahan.
SetUrlCacheEntryInfo Mengatur anggota struktur INTERNET_CACHE_ENTRY_INFO yang ditentukan.
UnlockUrlCacheEntryFile Membuka kunci entri cache yang dikunci ketika file diambil untuk digunakan dari cache oleh RetrieveUrlCacheEntryFile.
UnlockUrlCacheEntryStream Menutup aliran yang telah diambil menggunakan RetrieveUrlCacheEntryStream.

 

Menghitung Cache

Fungsi FindFirstUrlCacheEntry dan FindNextUrlCacheEntry menghitung informasi yang disimpan dalam cache. FindFirstUrlCacheEntry memulai enumerasi dengan mengambil pola pencarian, buffer, dan ukuran buffer untuk membuat handel dan mengembalikan entri cache pertama. FindNextUrlCacheEntry mengambil handel yang dibuat oleh FindFirstUrlCacheEntry, buffer, dan ukuran buffer untuk mengembalikan entri cache berikutnya.

Kedua fungsi menyimpan struktur INTERNET_CACHE_ENTRY_INFO di buffer. Ukuran struktur ini bervariasi untuk setiap entri. Jika ukuran buffer yang diteruskan ke salah satu fungsi tidak mencukupi, fungsi gagal dan GetLastError mengembalikan ERROR_INSUFFICIENT_BUFFER. Variabel ukuran buffer berisi ukuran buffer yang diperlukan untuk mengambil entri cache tersebut. Buffer ukuran yang ditunjukkan oleh variabel ukuran buffer harus dialokasikan, dan fungsi harus dipanggil lagi dengan buffer baru.

Struktur INTERNET_CACHE_ENTRY_INFO berisi ukuran struktur, URL informasi cache, nama file lokal, jenis entri cache, jumlah penggunaan, laju klik, ukuran, waktu terakhir diubah, kedaluwarsa, akses terakhir, waktu terakhir yang disinkronkan, informasi header, ukuran informasi header, dan ekstensi nama file.

Fungsi FindFirstUrlCacheEntry mengambil pola pencarian, buffer yang menyimpan struktur INTERNET_CACHE_ENTRY_INFO , dan ukuran buffer. Saat ini, hanya pola pencarian default, yang mengembalikan semua entri cache, yang diimplementasikan.

Setelah cache dijumlahkan, aplikasi harus memanggil FindCloseUrlCache untuk menutup handel enumerasi cache.

Contoh berikut menampilkan URL setiap entri cache dalam kotak daftar, IDC_CacheList. Ini menggunakan MAX_CACHE_ENTRY_INFO_SIZE untuk awalnya mengalokasikan buffer, karena versi awal API WinINet tidak menghitung cache dengan benar sebaliknya. Versi yang lebih baru menghitung cache dengan benar dan tidak ada batas ukuran cache. Semua aplikasi yang berjalan di komputer dengan versi WinINet API dari Internet Explorer 4.0 harus mengalokasikan buffer dengan ukuran yang diperlukan. Untuk informasi selengkapnya, lihat Menggunakan Buffer.

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;        
}

Mengambil Informasi Entri Cache

Fungsi GetUrlCacheEntryInfo memungkinkan Anda mengambil struktur INTERNET_CACHE_ENTRY_INFO untuk URL yang ditentukan. Struktur ini berisi ukuran struktur, URL informasi yang di-cache, nama file lokal, jenis entri cache, jumlah penggunaan, laju hit, ukuran, waktu terakhir dimodifikasi, kedaluwarsa, akses terakhir, waktu terakhir yang disinkronkan, informasi header, ukuran informasi header, dan ekstensi nama file.

GetUrlCacheEntryInfo menerima URL, buffer untuk struktur INTERNET_CACHE_ENTRY_INFO , dan ukuran buffer. Jika URL ditemukan, informasi disalin ke dalam buffer. Jika tidak, fungsi gagal dan GetLastError mengembalikan ERROR_FILE_NOT_FOUND. Jika ukuran buffer tidak mencukupi untuk menyimpan informasi entri cache, fungsi gagal dan GetLastError mengembalikan ERROR_INSUFFICIENT_BUFFER. Ukuran yang diperlukan untuk mengambil informasi disimpan dalam variabel ukuran buffer.

GetUrlCacheEntryInfo tidak melakukan penguraian URL apa pun, sehingga URL yang berisi jangkar (#) tidak akan ditemukan di cache, bahkan jika sumber daya di-cache. Misalnya, jika URL "https://example.com/example.htm#sample" diteruskan, fungsi mengembalikan ERROR_FILE_NOT_FOUND bahkan jika "https://example.com/example.htm" ada di cache.

Contoh berikut mengambil informasi entri cache untuk URL yang ditentukan. Fungsi kemudian menampilkan informasi header dalam kotak edit 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;
    }
        
}

Membuat Entri Cache

Aplikasi menggunakan fungsi CreateUrlCacheEntry dan CommitUrlCacheEntry untuk membuat entri cache.

CreateUrlCacheEntry menerima URL, ukuran file yang diharapkan, dan ekstensi nama file. Fungsi kemudian membuat nama file lokal untuk menyimpan entri cache yang sesuai dengan URL dan ekstensi nama file.

Dengan menggunakan nama file lokal, tulis data ke dalam file lokal. Setelah data ditulis ke file lokal, aplikasi harus memanggil CommitUrlCacheEntry.

CommitUrlCacheEntry menerima URL, nama file lokal, kedaluwarsa, waktu terakhir diubah, jenis entri cache, informasi header, ukuran informasi header, dan ekstensi nama file. Fungsi ini kemudian menyimpan data dalam file yang ditentukan dalam penyimpanan cache dan mengaitkannya dengan URL yang diberikan.

Contoh berikut menggunakan nama file lokal, yang dibuat oleh panggilan sebelumnya ke CreateUrlCacheEntry, disimpan dalam kotak teks, IDC_LocalFile, untuk menyimpan teks dari kotak teks, IDC_CacheDump, di entri cache. Setelah data ditulis ke file menggunakan fopen, fprintf, dan fclose, entri dilakukan menggunakan 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;
    }
}

Menghapus Entri Singgahan

Fungsi DeleteUrlCacheEntry mengambil URL dan menghapus file cache yang terkait dengannya. Jika file cache tidak ada, fungsi gagal dan GetLastError mengembalikan ERROR_FILE_NOT_FOUND. Jika file cache saat ini dikunci atau sedang digunakan, fungsi gagal dan GetLastError mengembalikan ERROR_ACCESS_DENIED. File dihapus ketika tidak terkunci.

Mengambil File Entri Cache

Untuk aplikasi yang memerlukan nama file sumber daya, gunakan fungsi RetrieveUrlCacheEntryFile dan UnlockUrlCacheEntryFile . Aplikasi yang tidak memerlukan nama file harus menggunakan fungsi RetrieveUrlCacheEntryStream, ReadUrlCacheEntryStream, dan UnlockUrlCacheEntryStream untuk mengambil informasi dalam cache.

RetrieveUrlCacheEntryStream tidak melakukan penguraian URL apa pun, sehingga URL yang berisi jangkar (#) tidak akan ditemukan di cache, meskipun sumber daya di-cache. Misalnya, jika URL "https://example.com/example.htm#sample" diteruskan, fungsi mengembalikan ERROR_FILE_NOT_FOUND bahkan jika "https://example.com/example.htm" ada di cache.

RetrieveUrlCacheEntryFile menerima URL, buffer yang menyimpan struktur INTERNET_CACHE_ENTRY_INFO , dan ukuran buffer. Fungsi diambil dan dikunci untuk penelepon.

Setelah informasi dalam file digunakan, aplikasi harus memanggil UnlockUrlCacheEntryFile untuk membuka kunci file.

Grup Cache

Untuk membuat grup cache, fungsi CreateUrlCacheGroup harus dipanggil untuk menghasilkan GROUPID untuk grup cache. Entri dapat ditambahkan ke grup cache dengan menyediakan URL entri cache dan bendera INTERNET_CACHE_GROUP_ADD ke fungsi SetUrlCacheEntryGroup . Untuk menghapus entri cache dari grup, berikan URL entri cache dan bendera INTERNET_CACHE_GROUP_REMOVE ke SetUrlCacheEntryGroup.

Fungsi FindFirstUrlCacheEntryEx dan FindNextUrlCacheEntryEx dapat digunakan untuk menghitung entri dalam grup cache tertentu. Setelah enumerasi selesai, fungsi harus memanggil FindCloseUrlCache.

Menangani Struktur dengan Informasi Ukuran Variabel

Cache dapat berisi informasi ukuran variabel untuk setiap URL yang disimpan. Ini tercermin dalam struktur INTERNET_CACHE_ENTRY_INFO . Ketika fungsi cache mengembalikan struktur ini, fungsi tersebut membuat buffer yang selalu berukuran INTERNET_CACHE_ENTRY_INFO ditambah informasi ukuran variabel apa pun. Jika anggota pointer bukan NULL, itu menunjuk ke area memori segera setelah struktur. Saat menyalin buffer yang dikembalikan oleh fungsi ke buffer lain, anggota pointer harus diperbaiki untuk menunjuk ke tempat yang sesuai di buffer baru, seperti yang ditunjukkan contoh berikut.

lpDstCEInfo->lpszSourceUrlName = 
    (LPINTERNET_CACHE_ENTRY_INFO) ((LPBYTE) lpSrcCEInfo + 
       ((DWORD)(lpOldCEInfo->lpszSourceUrlName) - (DWORD)lpOldCEInfo));

Beberapa fungsi cache gagal dengan pesan kesalahan ERROR_INSUFFICIENT_BUFFER jika Anda menentukan buffer yang terlalu kecil untuk berisi informasi entri cache yang diambil oleh fungsi. Dalam hal ini, fungsi juga mengembalikan ukuran buffer yang diperlukan. Anda kemudian dapat mengalokasikan buffer dengan ukuran yang sesuai dan memanggil fungsi lagi.

Catatan

WinINet tidak mendukung implementasi server. Selain itu, itu tidak boleh digunakan dari layanan. Untuk implementasi atau layanan server, gunakan Microsoft Windows HTTP Services (WinHTTP).