it-swarm.dev

C # WebClient menonaktifkan cache

Selamat siang.

Saya menggunakan kelas WebClient dalam aplikasi C # saya untuk mengunduh file yang sama setiap menit, dan kemudian aplikasi melakukan pemeriksaan sederhana untuk melihat apakah file telah diubah, dan apakah ia melakukan sesuatu dengannya.

Ya karena file ini diunduh setiap menit, sistem caching WebClient adalah caching file, dan tidak mengunduh file lagi, cukup dengan mengambilnya dari cache, dan hal itu menghalangi memeriksa apakah file yang diunduh itu baru.

Jadi saya ingin tahu bagaimana cara menonaktifkan sistem caching dari kelas WebClient.

Saya sudah mencoba.

Client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);

Saya juga mencoba tajuk.

WebClient.Headers.Add("Cache-Control", "no-cache");

Tidak berhasil juga. Jadi bagaimana saya bisa menonaktifkan cache untuk selamanya?

Terima kasih.

SUNTING

Saya juga mencoba CacheLevels berikut: NoCacheNoStore, BypassCache, Reload. Tidak ada efek, namun jika saya me-reboot komputer saya cache tampaknya dihapus, tetapi saya tidak bisa me-reboot komputer setiap kali.

PEMBARUAN dalam menghadapi aktivitas terbaru (8 Set 2012)

answer ditandai sebagai diterima menyelesaikan masalah saya. Sederhananya, saya menggunakan Soket untuk mengunduh file dan itu menyelesaikan masalah saya. Pada dasarnya DAPATKAN meminta file yang diinginkan, saya tidak akan masuk ke detail tentang bagaimana melakukannya, karena saya yakin Anda dapat menemukan banyak "cara" di sini di SO di Untuk melakukan hal yang sama sendiri. Meskipun ini tidak berarti bahwa solusi saya juga yang terbaik untuk Anda, saran pertama saya adalah membaca jawaban lain dan melihat apakah ada yang berguna.

Yah, bagaimanapun, karena pertanyaan ini telah melihat beberapa kegiatan baru-baru ini, saya berpikir untuk menambahkan pembaruan ini untuk memasukkan beberapa petunjuk atau ide yang menurut saya harus dipertimbangkan oleh mereka yang menghadapi masalah serupa yang mencoba. semua yang mereka bisa pikirkan, dan yakin masalahnya tidak berbohong dengan kode mereka. Kemungkinan menjadi kode untuk sebagian besar kasus, tetapi kadang-kadang kita tidak melihatnya, hanya berjalan-jalan dan kembali setelah beberapa menit, dan Anda mungkin akan melihat rentang titik kosong seperti itu adalah yang paling jelas hal di tempat pertama.

Either way jika Anda yakin, maka dalam hal ini saya menyarankan untuk memeriksa cuaca permintaan Anda melewati beberapa perangkat lain dengan kemampuan caching (komputer, router, proxy, ...) sampai sampai ke tujuan yang dituju. 

Pertimbangkan bahwa sebagian besar permintaan melalui beberapa perangkat yang disebutkan sebelumnya, lebih lanjut umumnya router, kecuali tentu saja, Anda terhubung langsung ke Internet melalui penyedia layanan Anda jaringan.

Dalam satu waktu router saya sendiri sedang melakukan caching file, anehnya saya tahu, tapi itu masalahnya, setiap kali saya reboot atau terhubung langsung ke Internet masalah caching saya hilang. Dan tidak ada perangkat lain yang terhubung ke router yang bisa disalahkan, hanya komputer dan router.

Dan omong-omong, saran umum, meskipun sebagian besar berlaku untuk mereka yang bekerja di komputer pengembangan perusahaan mereka sendiri. Bisakah dengan perubahan apa pun komputer pengembangan Anda menjalankan layanan caching? Itu mungkin.

Selanjutnya pertimbangkan bahwa banyak situs web atau layanan kelas atas menggunakan Konten Jaringan Pengiriman (CDN), dan tergantung pada penyedia CDN, setiap kali file diperbarui atau diubah, dibutuhkan beberapa saat untuk .__ tersebut. perubahan untuk tercermin di seluruh jaringan. Karena itu mungkin mungkin Anda beruntung meminta file yang mungkin di tengah pembaruan, dan server CDN terdekat dengan Anda belum selesai memperbarui.

Dalam kasus apa pun, khususnya jika Anda selalu meminta file yang sama berulang kali, atau jika Anda tidak dapat menemukan letak masalahnya, maka jika mungkin, saya menyarankan Anda untuk mempertimbangkan kembali pendekatan Anda dalam meminta waktu file yang sama setelah waktu, dan alih-alih melihat ke dalam membangun Layanan Web sederhana , untuk memenuhi kebutuhan Anda pertama kali berpikir tentang memuaskan dengan file tersebut di tempat pertama.

Dan jika Anda mempertimbangkan opsi tersebut, saya pikir Anda mungkin akan lebih mudah membangun SISANYA Style Web API untuk kebutuhan Anda sendiri.

Saya harap pembaruan ini bermanfaat bagi Anda, pasti untuk saya saat kembali. Semoga sukses dengan upaya pengkodean Anda.

26
Fábio Antunes

Dari penjelasan di atas, saya kira Anda memiliki masalah di tempat lain. Bisakah Anda mencatat permintaan http di sisi server? Apa yang Anda dapatkan ketika Anda mengubah beberapa parameter seed acak?

Mungkin SERVER melakukan cache file (jika log menunjukkan bahwa permintaan benar-benar dipicu setiap menit.

Apakah Anda menggunakan ISA atau SQUID?

Apa kode respons http untuk permintaan Anda?

Saya tahu bahwa menjawab dengan jawaban mungkin tidak populer, tetapi komentar tidak mengizinkan saya sebanyak ini :)

EDIT:

Pokoknya, gunakan objek HttpRequest alih-alih WebClient, dan mudah-mudahan (jika Anda menaruh keraguan Anda pada WebClient) semuanya akan diselesaikan. Jika itu tidak diselesaikan dengan HttpRequest, maka masalahnya benar-benar IS di tempat lain.

Penyempurnaan lebih lanjut:

Lebih rendah lagi: Bagaimana cara Membuat Permintaan HTTP Secara Manual di .Net?

Ini adalah soket murni, dan jika masalahnya masih berlanjut, buka pertanyaan baru dan beri tag WTF :)

11

Anda dapat mencoba menambahkan beberapa nomor acak ke url Anda sebagai bagian dari querystring setiap kali Anda mengunduh file. Ini memastikan bahwa url unik setiap kali. 

Untuk mantan

Random random = new Random();
string url = originalUrl + "?random=" + random.Next().ToString();
webclient.DownloadFile(url, downloadedfileurl);
26
Vinay B R

Coba NoCacheNoStore :

Jangan pernah memenuhi permintaan dengan menggunakan sumber daya dari cache dan tidak menyimpan sumber daya. Jika sumber daya ada di cache lokal, itu dihapus. Tingkat kebijakan ini menunjukkan ke perantara cache bahwa mereka harus menghapus sumber daya. Dalam protokol caching HTTP, ini dicapai menggunakan direktif kontrol cache tanpa cache.

client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); 
10
KMån

Dalam beberapa skenario, perangkat lunak debug jaringan dapat menyebabkan masalah ini. Untuk memastikan url Anda tidak di-cache, Anda dapat menambahkan nomor acak sebagai parameter terakhir untuk membuat url unik. Parameter acak ini pada umumnya diabaikan oleh server (yang mencoba membaca parameter yang dikirim sebagai pasangan nilai nama). 

Contoh: http://www.someserver.com/?param1=val1&ThisIsRandom=RandomValue

Di mana ThisIsRandom = RandomValue adalah parameter baru yang ditambahkan.

7
ivymike

Semua metode di sini tampaknya tidak dapat menyelesaikan masalah: Jika halaman web pernah dapat diakses dan sekarang dihapus dari server, metode HttpWebResponse.GetResponse () akan memberi Anda respons untuk salinan cache dimulai dengan "Sebelum suatu periode waktu yang cukup telah berlalu, atau Anda me-restart komputer, itu TIDAK akan memicu pengecualian yang diharapkan untuk 404 halaman tidak ditemukan kesalahan, Anda tidak dapat mengetahui bahwa halaman web sekarang tidak keluar sama sekali sekarang.

Saya mencoba segalanya:

  • Setel seperti header ("Cache-Control", "no-cache")
  • Set "request.CachePolicy" ke "noCachePolicy"
  • Hapus IE tem/file sejarah. 
  • Gunakan Internet kabel tanpa router .......... TIDAK BEKERJA!

Untungnya, jika halaman web telah mengubah kontennya, HttpWebResponse.GetResponse() akan memberi Anda halaman baru untuk mencerminkan perubahan.

1
lbhl

Saya memiliki masalah yang sama dengan PowerShell menggunakan webClient, yang juga hadir setelah beralih untuk menggunakan webRequest. Apa yang saya temukan adalah bahwa soket digunakan kembali dan yang menyebabkan semua jenis caching sisi server/jaringan (dan dalam kasus saya penyeimbang beban terlalu terlalu bermasalah dengan https). Cara mengatasinya adalah dengan menonaktifkan keepalive dan mungkin pipeling di objek webrequest seperti di bawah ini yang akan memaksa soket baru untuk setiap permintaan:

#Define Funcs Function httpRequest {
     param([string]$myurl)
     $r = [System.Net.WebRequest]::Create($myurl)
     $r.keepalive = 0
     $sr = new-object System.IO.StreamReader (($r.GetResponse()).GetResponseStream())
     $sr.ReadToEnd() }
1
user856684
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);

Harus bekerja Pastikan Anda menghapus cache dan menghapus semua file yang diunduh sementara di Internet Explorer sebelum menjalankan kode karena System.Net dan IE keduanya menggunakan cache yang sama.

1
Darin Dimitrov

Saya kira Anda harus menggunakan webrequest/webresponse daripada webclient

    WebRequest request = WebRequest.Create(uri);
     // Define a cache policy for this request only. 
     HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
     request.CachePolicy = noCachePolicy;
     WebResponse response = request.GetResponse();

//below is the function for downloading the file

   public static int DownloadFile(String remoteFilename,
                           String localFilename)
    {
        // Function will return the number of bytes processed
        // to the caller. Initialize to 0 here.
        int bytesProcessed = 0;

        // Assign values to these objects here so that they can
        // be referenced in the finally block
        Stream remoteStream = null;
        Stream localStream = null;
        WebResponse response = null;

        // Use a try/catch/finally block as both the WebRequest and Stream
        // classes throw exceptions upon error
        try
        {
            // Create a request for the specified remote file name
            WebRequest request = WebRequest.Create(remoteFilename);
            // Define a cache policy for this request only. 
            HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
            request.CachePolicy = noCachePolicy;
            if (request != null)
            {
                // Send the request to the server and retrieve the
                // WebResponse object 
                response = request.GetResponse();

                if (response != null)
                {
                    if (response.IsFromCache)
                        //do what you want

                    // Once the WebResponse object has been retrieved,
                    // get the stream object associated with the response's data
                    remoteStream = response.GetResponseStream();

                    // Create the local file
                    localStream = File.Create(localFilename);

                    // Allocate a 1k buffer
                    byte[] buffer = new byte[1024];
                    int bytesRead;

                    // Simple do/while loop to read from stream until
                    // no bytes are returned
                    do
                    {
                        // Read data (up to 1k) from the stream
                        bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                        // Write the data to the local file
                        localStream.Write(buffer, 0, bytesRead);

                        // Increment total bytes processed
                        bytesProcessed += bytesRead;
                    } while (bytesRead > 0);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Close the response and streams objects here 
            // to make sure they're closed even if an exception
            // is thrown at some point
            if (response != null) response.Close();
            if (remoteStream != null) remoteStream.Close();
            if (localStream != null) localStream.Close();
        }

        // Return total bytes processed to caller.
        return bytesProcessed;
    }
1
Thakur

Menggunakan HTTPRequest jelas merupakan jawaban yang tepat untuk masalah Anda. Namun, jika Anda ingin agar objek WebBrowser/WebClient Anda tidak menggunakan halaman yang di-cache, Anda harus memasukkan tidak hanya "no-cache" tetapi semua header ini:

<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache-control" content="no-store">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">

Di IE11, itu tidak bekerja untuk saya sampai saya memasukkan salah satu atau kedua dari dua yang terakhir. 

1
Daniel

karena saya menggunakan yang berikut:

wclient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
wclient.Headers.Add("Cache-Control", "no-cache");

Saya tidak mendapatkan file cache lagi. 

Saya juga menambahkan fungsi ini yang saya temukan, untuk menghapus IE file temp sebelum setiap panggilan:

private void del_IE_files()
{
    string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
    //for deleting files

    System.IO.DirectoryInfo DInfo = new DirectoryInfo(path);
    FileAttributes Attr = DInfo.Attributes;
    DInfo.Attributes = FileAttributes.Normal;

    foreach (FileInfo file in DInfo.GetFiles())
    {
        file.Delete();
    }

    foreach (DirectoryInfo dir in DInfo.GetDirectories())
    {
        try
        {
            dir.Delete(true); //delete subdirectories and files
        }
        catch
        {

        }
    }
}
0
error

Pastikan Anda tidak dibatasi rate! Saya mendapatkan ini kembali dari server nginx:

403 Dilarang

Tingkat terbatas terlampaui, silakan coba lagi dalam 24 jam.

Ini adalah program yang saya gunakan (C #)

using System;
using System.IO;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DownloadFile();
            Console.ReadLine();
        }

        public static void DownloadFile()
        {
            var downloadedDatabaseFile = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());
            Console.WriteLine(downloadedDatabaseFile);

            var client = new WebClient();
            client.DownloadProgressChanged += (sender, args) =>
            {
                Console.WriteLine("{0} of {1} {2}%", args.BytesReceived, args.TotalBytesToReceive, args.ProgressPercentage);
            };

            client.DownloadFileCompleted += (sender, args) =>
            {
                Console.WriteLine("Download file complete");

                if (args.Error != null)
                {
                    Console.WriteLine(args.Error.Message);
                }
            };

            client.DownloadFileAsync(new Uri("http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dats.gz"), downloadedDatabaseFile);
        }
    }
}

Konsol mencetak:

C:\Users\jake.scott.WIN-J8OUFV09HQ8\AppData\Local\Temp\2\tmp7CA.tmp
Download file complete
The remote server returned an error: (403) Forbidden.
0
superlogical

Jika Anda memiliki Akses ke server web, buka Internet Explorer, masuk ke

Internet Explorer -> Internet Options -> Browsing History "Settings" -> Temporary Internet Files "never"

Bersihkan Cache Browser dan voila, itu akan berhasil!

0
efkah