2010-03-11 24 views
9

Tôi retreiving hình ảnh từ một thư mục máy chủ web như thế này:Có cách nào để buộc WebClient, không trả lại dữ liệu được lưu trong bộ nhớ cache không?

 WebClient webClientImgDownloader = new WebClient(); 
     webClientImgDownloader.OpenReadCompleted += new OpenReadCompletedEventHandler(webClientImgDownloader_OpenReadCompleted); 
     if(uriIndex < uris.Count()) 
      webClientImgDownloader.OpenReadAsync(new Uri(uris[uriIndex], UriKind.Absolute)); 

Nhưng tôi đã nhận thấy nếu tôi xóa hình ảnh, Silverlight tiếp tục lấy lại hình ảnh như thể nó là ở đó.

Khi tôi nhập URL hình ảnh vào FireFox, tôi cũng thấy hình ảnh, nhưng sau đó tôi bấm Reload và nó cho tôi lỗi thích hợp mà hình ảnh không tồn tại. Sau đó, khi tôi chạy ứng dụng Silverlight của tôi một lần nữa, nó cũng cung cấp cho tôi một lỗi rằng hình ảnh không tồn tại như thể trình duyệt đã xóa một cờ bộ nhớ đệm ở đâu đó.

Làm cách nào tôi có thể thực hiện "làm mới" qua WebClient trong mã, để nếu hình ảnh đột nhiên không tồn tại trên máy chủ, Silverlight không tiếp tục cung cấp cho tôi bản sao lưu của nó?

+0

WebClient không trả lại dữ liệu lưu trữ. Nó trả về dữ liệu được cung cấp bởi máy chủ và bất kỳ proxy caching nào. Bạn sẽ phải yêu cầu máy chủ gửi cho bạn dữ liệu mà bạn không muốn nhận. –

+1

@John: Thực ra trong trường hợp này tôi nghi ngờ rằng không có yêu cầu thực tế nào cả. WebClient sẽ sử dụng ngăn xếp của Trình duyệt và sẽ cung cấp nội dung ra khỏi bộ đệm cục bộ thay vì đưa ra yêu cầu tới máy chủ. – AnthonyWJones

+0

@Anthony: Tôi không biết rằng nó đang sử dụng lại nhiều thứ trong ngăn xếp trình duyệt. Bạn có một tham chiếu để nói rằng nó được thực hiện theo cách đó? –

Trả lời

7

Đây là một vấn đề khó khăn vì bộ nhớ đệm thường được gây ra bởi tiêu đề của trang web không chỉ định không có bộ nhớ cache. Tôi đã thấy rằng trong quá khứ cách dễ nhất để giải quyết các vấn đề bộ nhớ đệm này đơn giản là cung cấp một tham số chuỗi truy vấn ngẫu nhiên để máy chủ web diễn giải từng yêu cầu dưới dạng yêu cầu mới.

nếu bạn hiện đang yêu cầu www.domain.com/image.jpg sau đó thử www.domain.com/image.jpg?rand=XXXX trong đó XXXX là giá trị ngẫu nhiên được tạo trong mã phía máy chủ của bạn.

+1

Vấn đề với chuỗi truy vấn ngẫu nhiên là nó sẽ luôn tải xuống tài nguyên vì từ điểm nhìn của HTTP là tài nguyên khác, không có cách nào để xác định phiên bản được lưu trong bộ nhớ cache hiện tại là phiên bản hiện tại và có thể được sử dụng lại . Điều này có thể ảnh hưởng đến hiệu suất của một ứng dụng. – AnthonyWJones

+0

+1 cho ý tưởng chuỗi truy vấn ngẫu nhiên, miễn là hiệu suất không phải là vấn đề như đã lưu ý, điều này dường như buộc nó luôn cung cấp cho bạn phản hồi chính xác và bạn có thể thực hiện cài đặt này để trong khi phát triển, bao gồm chuỗi ngẫu nhiên, khi trang web của bạn xuất hiện trực tuyến và dữ liệu được đặt, bạn có thể xóa nó để có hiệu suất tốt hơn –

+0

Edward, đó chính xác là những gì tôi có xu hướng làm. Tôi thường sử dụng một String.Format ("{0} {1}", url, (HttpContext.Current.IsDebuggingEnabled)? RandomParam: String.Empty). Tôi đã tìm thấy điều này giúp tôi có được xung quanh IIS bộ nhớ đệm của các yếu tố không đăng ký ISAPI như các tập tin js vv –

4

Bạn cần quyết định chính sách lưu vào bộ nhớ cache của bạn là gì đối với nhiều nội dung khác nhau trên trang web của bạn.

Nếu bạn phải đảm bảo rằng trạng thái mới nhất được trình bày khi có yêu cầu được đảm bảo rằng máy chủ định cấu hình các tiêu đề phản hồi một cách thích hợp. Trong trường hợp này, hãy đảm bảo bạn có tiêu đề Cache-Control: max-age=0 được chỉ định trên hình ảnh (hoặc có nhiều khả năng trên thư mục chứa tập hợp hình ảnh).

Bằng cách đặt độ tuổi tối đa = 0, bạn sẽ làm cho trình duyệt cố gắng tìm nạp lại hình ảnh, tuy nhiên nó sẽ thông báo cho máy chủ về bất kỳ phiên bản hiện tại nào của hình ảnh trong bộ nhớ cache. Điều này cho phép máy chủ có cơ hội gửi trạng thái 404 vì hình ảnh đã bị xóa, 304 vì hình ảnh vẫn ở đó và không thay đổi để phiên bản được lưu trong bộ nhớ cache có thể được sử dụng hoặc 200 vì hình ảnh đã thay đổi. phiên bản mới.

+0

Loại giả định rằng anh ta có quyền kiểm soát máy chủ mà anh ta yêu cầu. Tôi tưởng tượng rằng anh ta đang sử dụng một webclient để có được những hình ảnh mà nó có nhiều khả năng là anh ta kéo chúng xuống bằng cách sử dụng WebClient đặc biệt bởi vì họ là từ xa/outwith kiểm soát của mình? –

+0

@Brian: Không có nghĩa là để nitpick, nhưng ông nói "Tôi đã nhận thấy nếu tôi loại bỏ hình ảnh," ngụ ý ông có quyền kiểm soát của máy chủ web. – Evan

0

Đây là giải pháp của tôi:

return new BitmapImage(new Uri(Mang.Communication.ServicePathUrl + "Icon.aspx?location=" + value.imageParameter + "&originalSize=true" + "?" + System.DateTime.Now.ToString(), UriKind.Absolute)); 
Các vấn đề liên quan