Aracılığıyla paylaş


Önbelleğe Alma (Windows Internet)

WinINet işlevleri basit, ancak esnek, yerleşik önbelleğe alma desteğine sahiptir. Ağdan alınan tüm veriler sabit diskte önbelleğe alınır ve sonraki istekler için alınır. Uygulama her istekte önbelleğe almayı denetleyebiliyor. Sunucudan gelen http istekleri için, alınan üst bilgilerin çoğu da önbelleğe alınır. Önbellekten bir http isteği karşılandığında, önbelleğe alınan üst bilgiler de çağırana döndürülür. Bu, verilerin önbellekten mi yoksa ağdan mı geldiği farketmeksizin veri indirme işlemini sorunsuz hale getirir.

Uygulamaların kalıcı URL önbelleğe alma işlevlerini kullanırken istenen sonuçları elde etmek için bir arabelleği düzgün bir şekilde ayırması gerekir. Daha fazla bilgi için bkz. Arabellekleri Kullanma.

Yanıt İşleme Sırasında Önbellek Davranışı

WinINet önbelleği RFC 2616'da açıklanan HTTP önbellek denetimi yönergeleriyle uyumludur. Önbellek denetimi yönergeleri ve uygulama kümesi bayrakları nelerin önbelleğe alınabileceğini belirler; ancak, WinINet aşağıdaki ölçüte göre gerçekte önbelleğe alınanları belirler:

  • WinINet yalnızca HTTP ve FTP yanıtlarını önbelleğe alır.
  • Yalnızca uygun yanıtlar önbellek tarafından depolanabilir ve takip eden bir İsteğe yanıt olarak kullanılabilir. İyi davranan yanıtlar, başarıyla dönen yanıtlar olarak tanımlanır.
  • Varsayılan olarak, WinINet sunucudan gelen bir önbellek kontrol yönergesi veya uygulama tanımlı bir bayrak yanıtın önbelleğe alınamayacağını belirtmediği sürece başarılı yanıtları önbelleğe alır.
  • Genel olarak, yukarıda listelenen gereksinimler karşılanırsa GET fiiline verilen yanıtlar önbelleğe alınır. PUT ve POST fiillerine verilen yanıtlar hiçbir koşulda önbelleğe alınmaz.
  • Önbellek dolu olsa bile öğeler önbelleğe alınır. Eklenen bir öğe önbelleği boyut sınırının üzerine getirirse, önbellek temizleyici zamanlanır. Varsayılan olarak, öğelerin önbellekte 10 dakikadan fazla kalacağı garanti değildir. Daha fazla bilgi için aşağıdaki Cache Scavenger bölümüne bakın.
  • Https varsayılan olarak önbelleğe alınır. Bu, uygulama tanımlı önbellek yönergeleri tarafından geçersiz kılınamayan genel bir ayar tarafından yönetilir. Genel ayarı geçersiz kılmak için, denetim masasında İnternet Seçenekleri uygulamasını seçin ve gelişmiş sekmesine gidin. "Güvenlik" bölümünün altındaki "Şifrelenmiş sayfaları diske kaydetme" kutusunu işaretleyin.

Önbellek Temizleyici

Önbellek temizleyici, öğeleri önbellekten düzenli aralıklarla temizler. Önbelleğe bir öğe eklenirse ve önbellek doluysa, öğe önbelleğe eklenir ve önbellek tutucu zamanlanır. Önbellek temizleyici bir temizleme turunu tamamlarsa ve önbellek, önbellek sınırına ulaşmadıysa, önbelleğe başka bir öğe eklendiğinde temizleyici başka bir tur için zamanlanır. Genel olarak, eklenen bir öğe önbelleği boyut sınırını aştığında, temizleyici devreye girer. Varsayılan olarak, önbellek denetimi yönergesinde aksi belirtilmedikçe önbellekte yaşam süresi en az 10 dakika olarak ayarlanır. Önbellek tutucu başlatıldığında, önbellekten ilk olarak en eski öğelerin silindiğinin garantisi yoktur.

Önbellek, aynı kullanıcı için bilgisayardaki tüm WinINet uygulamalarında paylaşılır. Windows Vista ve Windows Server 2008'den başlayarak önbellek boyutu diskin boyutunun 1/32'si olarak ayarlanır ve en az 8 MB ve en büyük boyut 50 MB olur.

Önbelleğe Almayı Denetlemek için Bayrakları Kullanma

Önbelleğe alma bayrakları, uygulamanın önbelleği ne zaman ve nasıl kullandığını denetlemesine olanak sağlar. Bu bayraklar tek başına veya İnternet'teki bilgilere veya kaynaklara erişen işlevlerde dwFlags parametresiyle birlikte kullanılabilir. Varsayılan olarak, işlevler İnternet'ten indirilen tüm verileri depolar.

Önbelleğe almayı denetlemek için aşağıdaki bayraklar kullanılabilir.

Değer Anlam
INTERNET_FLAG_CACHE_ASYNC Bu bayrağın hiçbir etkisi yoktur.
INTERNET_FLAG_CACHE_IF_NET_FAIL (İNTERNET_BAYRAĞI_AĞ_HATA_VERİRSE_ÖNBELLEKLE) Bir ERROR_INTERNET_CONNECTION_RESET veya ERROR_INTERNET_CANNOT_CONNECT hatası nedeniyle kaynak için ağ isteği başarısız olursa, önbellekten kaynağı döndürür. Bu bayrak httpopenRequesttarafından kullanılır.
INTERNET_FLAG_DONT_CACHE Verileri yerel olarak veya herhangi bir ağ geçidinde önbelleğe almaz. Tercih edilen değerle aynı, INTERNET_FLAG_NO_CACHE_WRITE.
Bunun bir Forms gönderimi olduğunu gösterir.
INTERNET_FLAG_FROM_CACHEINTERNET_FLAG_FORMS_SUBMIT Ağ isteğinde bulunmaz. Tüm varlıklar önbellekten döndürülür. İstenen öğe önbellekte değilse, ERROR_FILE_NOT_FOUND gibi uygun bir hata döndürülür. Yalnızca InternetOpen işlevi bu bayrağı kullanır.
INTERNET_FLAG_FWD_BACK İşlevin şu anda İnternet önbelleğinde bulunan kaynağın kopyasını kullanması gerektiğini gösterir. Son kullanma tarihi ve kaynakla ilgili diğer bilgiler işaretlenmez. İstenen öğe İnternet önbelleğinde bulunmazsa, sistem ağdaki kaynağı bulmaya çalışır. Bu değer Microsoft Internet Explorer 5'te kullanıma sunulmuştur ve Internet Explorer'ın İletme ve Geri düğmesi işlemleriyle ilişkilendirilir.
INTERNET_FLAG_HYPERLINK Kaynak önbelleğe kaydedildiğinde bir son kullanma süresi veya son değiştirilme zamanı döndürülmezse, uygulamayı kaynağı yeniden yüklemeye zorlar.
INTERNET_BAYRAĞI_KALICI_YAP Artık desteklenmiyor.
INTERNET_FLAG_MUST_CACHE_REQUEST Dosya önbelleğe alınamıyorsa geçici bir dosyanın oluşturulmasına neden olur. Bu, tercih edilen değer olan INTERNET_FLAG_NEED_FILEaynıdır.
INTERNET_FLAG_NEED_FILE Dosya önbelleğe alınamıyorsa geçici bir dosyanın oluşturulmasına neden olur.
INTERNET_FLAG_NO_CACHE_WRITE İşlevin İnternet'ten indirilen verileri önbellekte depolama girişimini reddeder. Uygulama indirilen kaynakların yerel olarak depolanmasını istemiyorsa bu bayrak gereklidir.
INTERNET_FLAG_NO_UI Tanımlama bilgisi iletişim kutusunu devre dışı bırakır. Bu bayrak, HttpOpenRequest ve InternetOpenUrl (yalnızca HTTP istekleri) tarafından kullanılabilir.
INTERNET_FLAG_OFFLINE Uygulamanın ağa istek göndermesini engeller. Tüm istekler önbellekte depolanan kaynaklar kullanılarak çözümlenir. Kaynak önbellekte değilse, ERROR_FILE_NOT_FOUND gibi uygun bir hata döndürülür.
INTERNET_FLAG_PRAGMA_NOCACHE Ara sunucuda önbelleğe alınmış bir kopya olsa bile isteğin kaynak sunucu tarafından çözümlenmesine zorlar. InternetOpenUrl işlevi (yalnızca HTTP ve HTTPS isteklerinde) ve HttpOpenRequest işlevi bu bayrağı kullanır.
INTERNET_FLAG_RELOAD İşlevi istenen kaynağı doğrudan İnternet'ten almaya zorlar. İndirilen bilgiler önbellekte depolanır.
İNTERNET_BAYRAĞI_SENKRONİZE_ET Bir uygulamanın İnternet'ten kaynağın koşullu indirmesini gerçekleştirmesine neden olur. Önbellekte depolanan sürüm geçerliyse, bilgiler önbellekten indirilir. Aksi takdirde, bilgiler sunucudan yeniden yüklenir.

 

Kalıcı Önbelleğe Alma İşlevleri

Kalıcı önbelleğe alma hizmetlerine ihtiyaç duyan istemciler, düşük bant genişliğine sahip bir bağlantının verilere erişimi sınırladığı veya erişimin hiç kullanılamadığı durumlarda uygulamalarının verileri sonraki kullanım için yerel dosya sistemine kaydetmesine izin vermek için kalıcı önbelleğe alma işlevlerini kullanır.

Önbellek işlevleri kalıcı önbelleğe alma ve çevrimdışı gözatma sağlar. INTERNET_FLAG_NO_CACHE_WRITE bayrağı, açıkça önbelleğe alınmamasını belirtmedikçe, işlevler ağdan indirilen tüm verileri önbelleğe alır. POST verilerine verilen yanıtlar önbelleğe alınmaz.

Kalıcı URL Önbelleği İşlevlerini Kullanma

Aşağıdaki kalıcı URL önbelleği işlevleri, bir uygulamanın önbellekte depolanan bilgilere erişmesine ve bunları işlemesine olanak sağlar.

Fonksiyon Açıklama
CommitUrlCacheEntryA Belirtilen dosyadaki verileri önbellek depolama alanında önbelleğe alır ve verilen URL ile ilişkilendirir.
CommitUrlCacheEntryW Belirtilen dosyadaki verileri önbellek depolama alanında önbelleğe alır ve verilen URL ile ilişkilendirir.
CreateUrlCacheEntry İstenen önbellek depolama alanını ayırır ve kaynak ada karşılık gelen önbellek girdisini kaydetmek için yerel bir dosya adı oluşturur.
CreateUrlCacheGroup Önbellek grubu tanımlaması oluşturur.
DeleteUrlCacheEntry Dosya varsa, kaynak adla ilişkilendirilmiş dosyayı önbellekten kaldırır.
DeleteUrlCacheGroup Önbellek dizini dosyasında bir GROUPID ve ilişkili tüm durumları serbest bırakır.
FindCloseUrlCache Belirtilen numaralandırma tutamacını kapatır.
FindFirstUrlCacheEntry Önbelleğin numaralandırmasını başlatır.
FindFirstUrlCacheEntryEx Önbelleğin filtrelenmiş numaralandırmasını başlatır.
FindNextUrlCacheEntry Önbellekteki bir sonraki girdiyi alır.
FindNextUrlCacheEntryEx Filtrelenmiş önbellek numaralandırmasında sonraki girdiyi alır.
GetUrlCacheEntryInfo Önbellek girdisi hakkındaki bilgileri alır.
GetUrlCacheEntryInfoEx HttpSendRequesttarafından çevrimdışı modda uygulanacak önbelleğe alınmış yeniden yönlendirmeleri çevirdikten sonra URL'yi arar.
ReadUrlCacheEntryStream RetrieveUrlCacheEntryStreamkullanılarak açılmış olan bir akıştan önbelleğe alınan verileri okur.
RetrieveUrlCacheEntryFile Önbellekten dosya biçiminde bir önbellek girdisi alır.
RetrieveUrlCacheEntryStream Önbellek verilerine erişmenin en verimli ve uygulamadan bağımsız yolunu sağlar.
SetUrlCacheEntryGroup Önbellek grubundan girdiler ekler veya kaldırır.
SetUrlCacheEntryInfo INTERNET_CACHE_ENTRY_INFO yapısının belirtilen üyelerini ayarlar.
UnlockUrlCacheEntryFile Dosya RetrieveUrlCacheEntryFiletarafından önbellekten kullanılmak üzere alındığında kilitlenen önbellek girdisinin kilidini açar.
UnlockUrlCacheEntryStream RetrieveUrlCacheEntryStreamkullanılarak alınan akışı kapatır.

 

Önbelleği Numaralandırma

FindFirstUrlCacheEntry ve FindNextUrlCacheEntry işlevleri önbellekte depolanan bilgileri numaralandırır. FindFirstUrlCacheEntry, bir arama düzeni, arabellek ve arabellek boyutu alarak bir tutamaç oluşturmak ve ilk önbellek girdisini döndürmek için numaralandırmayı başlatır. FindNextUrlCacheEntry, FindFirstUrlCacheEntrytarafından oluşturulan tanıtıcıyı, bir arabellek ve arabellek boyutunu alarak bir sonraki önbellek girdisini döndürür.

Her iki işlev de arabellekte INTERNET_CACHE_ENTRY_INFO bir yapı depolar. Bu yapının boyutu her giriş için değişir. İki işlevden birine geçirilen arabellek boyutu yetersizse, işlev başarısız olur ve GetLastError ERROR_INSUFFICIENT_BUFFER döndürür. Arabellek boyutu değişkeni, bu önbellek girdisini almak için gereken arabellek boyutunu içerir. Arabellek boyutu değişkeni tarafından belirtilen boyutta bir arabellek ayrılmalıdır ve işlev yeni arabellek ile yeniden çağrılmalıdır.

INTERNET_CACHE_ENTRY_INFO yapısı, yapı boyutunu, önbelleğe alınan bilgilerin URL'sini, yerel dosya adını, önbellek giriş türünü, kullanım sayısını, isabet oranını, boyutu, son değiştirme zamanını, süre sonunu, son erişimi, son eşitleme zamanını, üst bilgi bilgilerini, üst bilgi boyutunu ve dosya adı uzantısını içerir.

FindFirstUrlCacheEntry işlevi, bir arama deseni, INTERNET_CACHE_ENTRY_INFO yapısını depolayan bir arabellek ve arabelleğin boyutunu alır. Şu anda yalnızca tüm önbellek girdilerini döndüren varsayılan arama düzeni uygulanır.

Önbellek numaralandırıldıktan sonra uygulama, önbellek numaralandırma tutamacını kapatmak için FindCloseUrlCache çağırmalıdır.

Aşağıdaki örnek, her önbellek girdisinin URL'sini IDC_CacheListbir liste kutusunda görüntüler. WinINet API'nin ilk sürümleri önbelleği düzgün bir şekilde listelemediği için başlangıçta bir arabellek tahsis etmek için MAX_CACHE_ENTRY_INFO_SIZE kullanır. Sonraki sürümler önbelleği düzgün numaralandırır ve önbellek boyutu sınırı yoktur. Internet Explorer 4.0'dan WinINet API sürümüne sahip bilgisayarlarda çalışan tüm uygulamaların gerekli boyutta bir arabellek ayırması gerekir. Daha fazla bilgi için bkz. Arabellekleri Kullanma.

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

Önbellek Kaydı Bilgileri Alınıyor

GetUrlCacheEntryInfo işlevi, belirtilen URL için INTERNET_CACHE_ENTRY_INFO yapısını almanıza olanak tanır. Bu yapı, yapı boyutunu, önbelleğe alınan bilgilerin URL'sini, yerel dosya adını, önbellek giriş türünü, kullanım sayısını, isabet oranını, boyutu, son değiştirme zamanını, süre sonunu, son erişimi, son eşitleme saatini, üst bilgi bilgilerini, üst bilgi boyutunu ve dosya adı uzantısını içerir.

GetUrlCacheEntryInfo bir URL,INTERNET_CACHE_ENTRY_INFO yapısı için arabellek ve arabellek boyutunu kabul eder. URL bulunursa, bilgiler arabelleğe kopyalanır. Aksi takdirde işlev başarısız olur ve GetLastErrorERROR_FILE_NOT_FOUND döndürür. Önbellek girişi bilgilerini depolamak için arabellek boyutu yetersizse, işlev başarısız olur ve GetLastError ERROR_INSUFFICIENT_BUFFER döndürür. Bilgileri almak için gereken boyut arabellek boyutu değişkeninde depolanır.

GetUrlCacheEntryInfo herhangi bir URL ayrıştırma yapmaz, bu nedenle kaynak önbelleğe alınmış olsa bile yer işareti (#) içeren bir URL önbellekte bulunmaz. Örneğin, URL "https://example.com/example.htm#sample"" geçirilirse, "https://example.com/example.htm"" önbellekte olsa bile, işlev ERROR_FILE_NOT_FOUND döndürür.

Aşağıdaki örnek, belirtilen URL için önbellek girdisi bilgilerini alır. İşlev daha sonra üst bilgi bilgilerini IDC_CacheDump düzenleme kutusunda görüntüler.

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

Önbellek Girdisi Oluşturma

Bir uygulama, önbellek girdisi oluşturmak için CreateUrlCacheEntryve CommitUrlCacheEntryişlevlerinikullanır.

CreateUrlCacheEntry URL'yi, beklenen dosya boyutunu ve dosya adı uzantısını kabul eder. İşlev daha sonra, URL ve dosya adı uzantısına karşılık gelen önbellek girdisini kaydetmek için yerel bir dosya adı oluşturur.

Yerel dosya adını kullanarak verileri yerel dosyaya yazın. Veriler yerel dosyaya yazıldıktan sonra uygulamanın CommitUrlCacheEntryçağrısı yapması gerekir.

CommitUrlCacheEntry URL'yi, yerel dosya adını, süre sonunu, son değiştirme zamanını, önbellek giriş türünü, üst bilgi bilgilerini, üst bilgi boyutunu ve dosya adı uzantısını kabul eder. İşlev daha sonra önbellek depolama alanında belirtilen dosyadaki verileri önbelleğe alır ve verilen URL ile ilişkilendirir.

Aşağıdaki örnek, IDC_LocalFilemetin kutusunda depolanan ve önceki bir CreateUrlCacheEntryçağrısı tarafından oluşturulan yerel dosya adını kullanarak, IDC_CacheDumpmetin kutusundaki metni önbellek girdisine depolar. Veriler fopen, fprintfve fclosekullanılarak dosyaya yazıldıktan sonra, girdi CommitUrlCacheEntrykullanılarak taahhüt edilir.

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

Önbellek Girdisini Silme

DeleteUrlCacheEntry işlevi bir URL alır ve onunla ilişkili önbellek dosyasını kaldırır. Önbellek dosyası yoksa işlev başarısız olur ve GetLastErrorERROR_FILE_NOT_FOUND döndürür. Önbellek dosyası şu anda kilitli veya kullanımdaysa işlev başarısız olur ve GetLastErrorERROR_ACCESS_DENIED döndürür. Dosyanın kilidi açıldığında silinir.

Önbellek Giriş Dosyalarını Alma

Kaynağın dosya adını gerektiren uygulamalar için RetrieveUrlCacheEntryFilekullanın ve UnlockUrlCacheEntryFileişlevlerini. Dosya adı gerektirmeyen uygulamalar, önbellekteki bilgileri almak için RetrieveUrlCacheEntryStream, readUrlCacheEntryStreamve UnlockUrlCacheEntryStreamişlevlerinikullanmalıdır.

RetrieveUrlCacheEntryStream herhangi bir URL ayrıştırma yapmaz, bu nedenle kaynak önbelleğe alınmış olsa bile yer işareti (#) içeren bir URL önbellekte bulunmaz. Örneğin, URL "https://example.com/example.htm#sample"" verildiğinde, "https://example.com/example.htm"" önbellekte olsa bile işlev ERROR_FILE_NOT_FOUND döndürür.

RetrieveUrlCacheEntryFile bir URL'yi, INTERNET_CACHE_ENTRY_INFO yapısını depolayan bir arabelleği ve arabellek boyutunu kabul eder. Fonksiyon alınır ve çağıran için kilitlenir.

Dosyadaki bilgiler kullanıldıktan sonra uygulamanın dosyanın kilidini açmak için UnlockUrlCacheEntryFileçağrısı yapması gerekir.

Önbellek Grupları

Önbellek grubu oluşturmak için, önbellek grubu için bir GROUPID oluşturmak üzere CreateUrlCacheGroupişlevi çağrılmalıdır. Girdiler, önbellek girdisinin URL'si ve INTERNET_CACHE_GROUP_ADD bayrağı SetUrlCacheEntryGroup işlevine sağlanarak önbellek grubuna eklenebilir. Bir gruptan önbellek girdisini kaldırmak için önbellek girdisinin URL'sini ve INTERNET_CACHE_GROUP_REMOVE bayrağını SetUrlCacheEntryGroupgeçirin.

FindFirstUrlCacheEntryEx ve FindNextUrlCacheEntryEx işlevleri, belirtilen önbellek grubundaki girdileri listelemek için kullanılabilir. Numaralandırma tamamlandıktan sonra işlevi FindCloseUrlCacheçağırmalıdır.

Değişken Boyut Bilgileriyle Yapıları İşleme

Önbellek, depolanan her URL için değişken boyut bilgileri içerebilir. Bu, INTERNET_CACHE_ENTRY_INFO yapısına yansıtılır. Önbellek işlevleri bu yapıyı döndürdüğünde, her zaman INTERNET_CACHE_ENTRY_INFO boyutunda ve herhangi bir değişken boyutlu bilgi içeren bir arabellek oluşturur. İşaretçi üyesi NULLdeğilse, yapının hemen ardındaki bellek alanına işaret eder. bir işlev tarafından döndürülen arabelleği başka bir arabelleğe kopyalarken, aşağıdaki örnekte gösterildiği gibi işaretçi üyeleri yeni arabellekte uygun yere işaret etmek üzere düzeltilmelidir.

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

İşlev tarafından alınan önbellek girişi bilgilerini içeremeyecek kadar küçük bir arabellek belirtirseniz bazı önbellek işlevleri ERROR_INSUFFICIENT_BUFFER hata iletisiyle başarısız olur. Bu durumda işlev, gerekli arabellek boyutunu da döndürür. Daha sonra uygun boyutta bir arabellek ayırabilir ve işlevi yeniden çağırabilirsiniz.

Not

WinINet, sunucu uygulamalarını desteklemez. Ayrıca, bir hizmet üzerinden kullanılmamalıdır. Sunucu uygulamaları veya hizmetleri için Microsoft Windows HTTP Services (WinHTTP)kullanın.