2008-08-14 9 views
49

Đối với blog của tôi Tôi muốn sử dụng Cache Output để cứu một phiên bản cache của một bài perticular cho khoảng 10 phút, và thats tốt ...Clearing Page Cache trong ASP.NET

<%@OutputCache Duration="600" VaryByParam="*" %> 

Tuy nhiên, nếu ai đó đăng bình luận, tôi muốn xóa bộ nhớ cache để trang được làm mới và nhận xét có thể được nhìn thấy.

Làm cách nào để thực hiện việc này trong ASP.Net C#?

Trả lời

45

tôi đã tìm thấy câu trả lời tôi đang tìm kiếm:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx"); 
+0

có ai biết điều gì đó như thế này có sẵn cho ASP cổ điển không? – Brettski

+0

Tôi không nghĩ rằng bộ nhớ đệm có sẵn trong ASP, vì vậy không xin lỗi. – GateKiller

+0

Thao tác này sẽ xóa tất cả bộ đệm cho mọi thông số cho trang đó. – Salim

1

Hmm. Bạn có thể chỉ định một thuộc tính VaryByCustom trên mục OutputCache. Giá trị của điều này được chuyển như một tham số cho phương thức GetVaryByCustomString mà bạn có thể thực hiện trong global.asax. Giá trị được trả về bởi phương thức này được sử dụng như một chỉ mục trong các mục được lưu trong bộ nhớ cache - ví dụ: nếu bạn trả về số lượng nhận xét trên trang, mỗi lần một nhận xét được thêm vào một trang mới sẽ được lưu vào bộ nhớ cache.

Thông báo trước cho điều này là điều này không thực sự xóa bộ nhớ cache. Nếu một mục nhập blog được sử dụng bình luận nặng, bộ nhớ cache của bạn có thể phát nổ với kích thước bằng phương pháp này. Ngoài ra, bạn có thể triển khai các bit không thể thay đổi của trang (điều hướng, quảng cáo, mục nhập blog thực tế) khi người dùng kiểm soát và triển khai bộ nhớ đệm một phần trên mỗi điều khiển người dùng đó.

1

Nếu bạn thay đổi "*" để chỉ các thông số bộ nhớ cache nên thay đổi trên bạn có thể làm một cái gì đó như thế này (postID?):

//add dependency 
string key = "post.aspx?id=" + PostID.ToString(); 
Cache[key] = new object(); 
Response.AddCacheItemDependency(key); 

và khi ai đó thêm một nhận xét ...

Cache.Remove(key); 

Tôi đoán điều này sẽ hoạt động ngay cả với VaryByParam *, vì tất cả các yêu cầu sẽ được gắn với cùng một phụ thuộc bộ nhớ cache.

5

Sử dụng Response.AddCacheItemDependency để xóa tất cả outputcaches.

public class Page : System.Web.UI.Page 
    { 
    protected override void OnLoad(EventArgs e) 
    { 
     try 
     { 
      string cacheKey = "cacheKey"; 
      object cache = HttpContext.Current.Cache[cacheKey]; 
      if (cache == null) 
      { 
       HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString(); 
      } 

      Response.AddCacheItemDependency(cacheKey); 
     } 
     catch (Exception ex) 
     { 
      throw new SystemException(ex.Message); 
     } 

     base.OnLoad(e); 
    }  
} 



    // Clear All OutPutCache Method  

    public void ClearAllOutPutCache() 
    { 
     string cacheKey = "cacheKey"; 
     HttpContext.Cache.Remove(cacheKey); 
    } 

Điều này cũng có thể được sử dụng trong ASP.NET MVC's OutputCachedPage.

+0

Tuyệt vời, đó là những gì tôi đang tìm kiếm. Chỉ có một điều bạn nên thay đổi. HttpContext.Current.Cache.Remove (cacheKey); – Salim

1

tại sao không sử dụng phụ thuộc sqlcached trên bảng bài đăng?

sqlcachedependency msdn

Bằng cách này bạn không thực hiện bộ nhớ cache đang thanh toán bù trừ tùy chỉnh và chỉ cần làm mới bộ nhớ cache khi thay đổi nội dung trong db?

38

Ở trên là tốt nếu bạn biết những trang nào bạn muốn xóa bộ nhớ cache. Trong trường hợp của tôi (ASP.NET MVC) tôi tham chiếu cùng một dữ liệu từ khắp nơi. Vì vậy, khi tôi đã thực hiện một [lưu] tôi muốn xóa bộ nhớ cache trang web rộng. Đây là những gì đã làm việc cho tôi: http://aspalliance.com/668

Điều này được thực hiện trong ngữ cảnh của bộ lọc OnActionExecuting. Nó có thể dễ dàng được thực hiện bằng cách ghi đè OnActionExecuting trong một BaseController hoặc một cái gì đó.

HttpContextBase httpContext = filterContext.HttpContext; 
httpContext.Response.AddCacheItemDependency("Pages"); 

Setup:

protected void Application_Start() 
{ 
    HttpRuntime.Cache.Insert("Pages", DateTime.Now); 
} 

Tweak nhỏ: Tôi có một helper mà thêm "thông điệp flash" (Thông báo lỗi, các thông điệp thành công - "Mục này đã được lưu thành công", vv). Để tránh tin nhắn flash hiển thị trên mỗi lần GET tiếp theo, tôi đã phải vô hiệu hóa sau khi viết tin nhắn flash.

Clearing Cache:

HttpRuntime.Cache.Insert("Pages", DateTime.Now); 

Hope this helps.

+3

Ir chỉ hoạt động cho toàn bộ bộ nhớ đệm của trang. Nó không hoạt động cho các hành động của trẻ em. Bất kỳ đề xuất? –

+3

và.maz bạn đã tìm ra điều này? –

+0

@ and.maz Trong trường hợp bạn đã tìm ra cách thực hiện điều này cho hành động của trẻ em, có một tiền thưởng [ở đây] (http://stackoverflow.com/q/5126751/63733). – marapet

0

HttpRuntime.Close() .. Tôi thử tất cả các phương pháp và điều này là duy nhất mà làm việc cho tôi

+6

Tôi có thể cho rằng điều này đang đóng ASP. NET quá trình ứng dụng trên IIS. Điều này có vẻ hơi quá mức, có thể sẽ xóa tất cả bộ nhớ cache và sẽ có vấn đề về hiệu suất đáng kể trên các trang web lớn. – GateKiller

3

Trên sự kiện tải trang chủ, xin vui lòng viết như sau:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

và trong nút logout nhấp chuột:

Session.Abandon(); 
Session.Clear();