2009-02-10 43 views
21

Tôi đang phát triển chống lại một thư viện độc quyền và tôi đang gặp phải một số sự cố với bộ nhớ cache của HttpWebRequest. Thư viện đang sử dụng mã tương đương với mã bên dưới để thực hiện các yêu cầu:Cách xóa bộ nhớ cache của HttpWebRequest

var request = WebRequest.Create("http://example.com/") as HttpWebRequest; 

request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 

Tài nguyên bên ngoài không cho phép lưu vào bộ nhớ cache mặc dù mỗi câu trả lời khác nhau. Vì vậy, tôi kết thúc nhận được cùng một phản ứng mỗi lần.

Có cách nào để xóa nội dung của bộ nhớ cache HttpWebRequest không? Giải pháp đúng là sửa chữa nguồn bên ngoài hoặc có thể thay đổi chính sách bộ nhớ cache, nhưng không phải là có thể - do đó là câu hỏi.

Xóa bộ nhớ cache có thể có tác động khác nhau, vì vậy tốt nhất là giải pháp sẽ làm mất hiệu lực bộ nhớ cache trên cơ sở cho mỗi tài nguyên.

+0

câu trả lời cho điều này là gì? Câu trả lời của Bradley là những gì tôi nghĩ là đúng nhưng theo kinh nghiệm tôi đã tìm thấy việc xóa bộ đệm ẩn của IE (và sử dụng Fiddler) không hoạt động. –

+0

Tôi biết điều này đã được hỏi một số thời gian trước đây, tôi nghĩ rằng câu hỏi này [Xóa bộ nhớ cache trang trong ASP.Net] (http://stackoverflow.com/a/11641/128984) có thể được một số trợ giúp là tốt. – Micah

Trả lời

12
public static WebResponse GetResponseNoCache(Uri uri) 
{ 
     // Set a default policy level for the "http:" and "https" schemes. 
     HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default); 
     HttpWebRequest.DefaultCachePolicy = policy; 
     // Create the request. 
     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(); 
     Console.WriteLine("IsFromCache? {0}", response.IsFromCache);    
     return response; 
} 

Bạn có thể đặt Chính sách bộ nhớ cache thành yêu cầu NoCacheNoStore thành HttpWebRequest.

+1

Như đã nêu, không thể thay đổi chính sách bộ nhớ cache. Tôi muốn một giải pháp để thực sự xóa bộ nhớ cache lưu trữ - không tránh bộ nhớ đệm hoàn toàn. –

+0

Tôi tin rằng CyberMing là chính xác. NoCacheNoStore sẽ thực sự xóa bộ nhớ cache cho url được yêu cầu và thực sự có thể là những gì bạn đang tìm kiếm? > (từ tài liệu) HttpRequestCacheLevel.NoCacheNoStore ... Không bao giờ thỏa mãn yêu cầu bằng cách sử dụng tài nguyên từ bộ nhớ cache và không lưu trữ tài nguyên. ** Nếu tài nguyên có trong bộ đệm cục bộ, nó sẽ bị xóa ** ... – snowcode

+0

Tôi đã tìm kiếm làm thế nào để biết phản ứng đến từ đâu (từ bộ nhớ cache hay không vì Trạng thái luôn là 200 nếu không có bộ nhớ cache được sử dụng) và bạn trả lời cho tôi: IsFromcache. Cảm ơn. – MuiBienCarlota

0

Bạn có thể thay đổi chính sách bộ nhớ cache: sử dụng proxy ngược http và xóa/thay đổi tiêu đề http có liên quan. Đó là một hack, nhưng nó sẽ làm việc, và khá dễ dàng. Tôi muốn đề nghị bạn sử dụng máy chủ httpd Apache cho nhiệm vụ này (với mod_proxy).

1

Tôi chưa thử, nhưng giải pháp có thể là thêm một chuỗi truy vấn tùy ý vào url được yêu cầu.

Chuỗi truy vấn này sẽ thay đổi mọi lúc, có thể sử dụng DateTime.Now có nghĩa là url sẽ khác nhau mỗi lần. Mỗi yêu cầu sau đó sẽ được yêu cầu được cho là một lần nữa.

10

HttpWebRequest sử dụng System.Net.Cache.RequestCache để lưu vào bộ nhớ cache. Đây là một lớp trừu tượng; việc thực hiện thực tế trong CLR của Microsoft là Microsoft.Win32.WinInetCache, như tên của nó, sử dụng các hàm WinInet để lưu vào bộ nhớ đệm.

Đây là cùng một bộ nhớ cache được Internet Explorer sử dụng, vì vậy bạn có thể xóa bộ nhớ cache theo cách thủ công bằng cách sử dụng hộp thoại Xóa lịch sử duyệt web của IE. (Làm điều này đầu tiên là một thử nghiệm, để đảm bảo thanh toán bù trừ bộ nhớ cache WinInet giải quyết vấn đề của bạn.)

Giả sử thanh toán bù trừ bộ nhớ cache WinInet giải quyết vấn đề, bạn có thể xóa các file lập trình bởi P/Gọi để API DeleteUrlCacheEntry WinInet:

public static class NativeMethods 
{ 
    [DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)] 
    public static extern void DeleteUrlCacheEntry(string url); 
} 
+0

Bạn đã đúng, Microsoft.Win32.WinInetCache tham gia và đáp ứng được đọc từ Microsoft.Win32.WinInetCache.ReadStream nhưng nó không có nghĩa là nó vị trí bộ nhớ cache cùng hơn IE. – MuiBienCarlota

+3

@MuiBienCarlota: Trong thực tế, tôi đã tìm thấy nó. Theo như tôi biết, Internet Explorer vẫn sử dụng các chức năng bộ nhớ cache của WinInet; nếu cả tệp và .NET đang chạy trong cùng một tài khoản người dùng, các tệp được tạo/xóa bởi 'CreateUrlCacheEntry' và' DeleteUrlCacheEntry' phải ở cùng một vị trí. –

-1

Thêm dòng sau để xóa bộ nhớ cache và khi WebClient fetches các dữ liệu:

Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache") 
Các vấn đề liên quan