2010-05-13 25 views
7

Trong ứng dụng ASP.NET của tôi, tôi sử dụng HttpWebRequest để tìm nạp tài nguyên bên ngoài mà tôi muốn được lưu vào bộ nhớ cache. Xét đoạn mã sau:Làm cách nào để buộc HttpWebRequest sử dụng bộ nhớ cache trong môi trường ASP.NET?

var req = WebRequest.Create("http://google.com/"); 
req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 
var resp = req.GetResponse(); 
Console.WriteLine(resp.IsFromCache); 
var answ = (new StreamReader(resp.GetResponseStream())).ReadToEnd(); 
Console.WriteLine(answ.Length); 

HttpWebRequest sử dụng bộ nhớ cache trình duyệt IE, vì vậy khi tôi chạy nó như là người dùng bình thường (trong ứng dụng thử nghiệm cmd nhỏ), dữ liệu được lưu trữ để %userprofile%\Local Settings\Temporary Internet Files và phản ứng tiếp theo được đọc từ bộ nhớ cache.

Tôi nghĩ rằng khi mã như vậy được chạy bên trong ứng dụng ASP.NET, dữ liệu sẽ được lưu vào bộ nhớ cache ...\ASPNET\Local Settings\Temporary Internet Files nhưng không phải là bộ nhớ cache và không bao giờ được sử dụng.

Tôi đang làm gì sai? Làm thế nào để lực lượng HttpWebRequest sử dụng bộ nhớ cache trong môi trường ASP.NET?

+0

Ứng dụng ASP.NET của bạn đang chạy dưới dạng tài khoản nào? Bộ nhớ cache sẽ được tạo trong tài khoản đó. – feroze

+0

@feroze: Ứng dụng đang chạy dưới tài khoản ASPNET và tôi biết đường dẫn Tệp Internet Tạm thời để kiểm tra Environment.SpecialFolder.InternetCache. Vấn đề không phải là tôi không biết các mục trong bộ nhớ cache được tạo ra nhưng chúng không được tạo ra ở tất cả. – piotrsz

+0

Bạn có thể thêm một dòng để đóng và vứt bỏ đối tượng phản hồi: resp.Close(); và sau đó kiểm tra xem bạn vẫn gặp sự cố? – feroze

Trả lời

0

Tôi có thể sai nhưng tôi nghi ngờ rằng HttpWebRequest tôn trọng tiêu đề bộ nhớ cache từ tài nguyên bất kể mong muốn đã nêu của bạn.

Kiểm tra tiêu đề phản hồi và đảm bảo rằng tài nguyên không yêu cầu không được lưu trữ một cách rõ ràng.

+1

Tôi nghi ngờ tiêu đề quá vì vậy tôi xây dựng một ứng dụng cmd nhỏ mà làm cho httprequest vào cùng một tài nguyên. Trong ứng dụng cmd nó được lưu trữ. Và trong ứng dụng ASP.NET nó không phải. – piotrsz

1

Bạn có thể sử dụng bộ nhớ cache bằng tay trong mã của bạn như thế này:

Cache.Insert("request", req, Nothing, DateTime.Now, TimeSpan.FromSeconds(30), TimeSpan.Zero) 

Bạn có thể sử dụng phương pháp này như bạn sẽ sử dụng bộ nhớ đệm với trong web.config.

+0

Tôi có lẽ sẽ kết thúc việc triển khai bộ nhớ cache tùy chỉnh nhưng tôi đã hy vọng một số giải pháp "ngoài hộp" đơn giản ... – piotrsz

+0

Tôi nghĩ rằng không có vấn đề gì xảy ra với bạn nhưng đây không phải là vấn đề lớn triển khai thực hiện. – MUG4N

1

Tôi biết đây là một chủ đề cũ, nhưng một điều khác cần xem xét liên quan đến vấn đề này là cài đặt bảo mật của IE cho tài khoản người dùng mà ứng dụng ASP.NET đang chạy. HTTP caching (CachePolicy.Level = Mặc định, tài nguyên có thể lưu vào HTTP) không hoạt động cho ứng dụng của chúng tôi cho đến khi chúng tôi thêm máy chủ từ xa vào danh sách Trusted Sites.

Bài viết này hữu ích cho việc khắc phục sự cố bộ nhớ cache của chúng tôi: http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx

Các vấn đề liên quan