2014-07-18 19 views
14

Tôi đang cố gắng triển khai bộ đệm ẩn bằng cách sử dụng CacheCow. Tôi có hai vấn đề:Caching ASP.NET Web API với CacheCow

  1. Trong một số trường hợp, tôi cần phải vô hiệu hóa bộ nhớ cache của một số tài nguyên theo cách thủ công. Ví dụ: Tôi có một tài nguyên được gọi là purchase và tài nguyên khác được gọi là pointMovements. Chúng không được kết nối hoàn toàn, nhưng thực hiện một bài đăng trong purchase, ngụ ý một số thay đổi trong pointMovement. Cachecow không phát hiện những thay đổi này bởi vì tôi không gọi API là pointmovements. Vì vậy, khi tôi gọi điểm cuối là pointmovements, các giá trị được lưu trong bộ nhớ cache và tôi không thể nhận được các giá trị mới.

    Để giải quyết vấn đề này, tôi cần phải vô hiệu hóa thủ công, làm cách nào có thể?

  2. Có một số trình điều khiển mà tôi không muốn lưu vào bộ nhớ cache. Tôi đang cố gắng sử dụng các thuộc tính để làm điều đó nhưng nó không hoạt động. Tôi đang theo dõi this article nhưng các thuộc tính bị bỏ qua.

    Làm cách nào để chỉ định bộ điều khiển nào cần lưu vào bộ nhớ cache?

+0

Hi, xin lỗi vì đã không nhận được lại cho bạn, bạn vẫn còn có vấn đề? – Aliostad

Trả lời

9

Tôi gặp phải một loạt vấn đề và tìm ra giải pháp cho vấn đề 2 (tắt bộ nhớ đệm bất kể cài đặt mặc định).

// This forces the server to not provide any caching by refreshing its cache table immediately (0 sec) 
[HttpCacheRefreshPolicy(0)] 
// This forces the client (browser) to not cache any data returned from the server (even if ETag is present) by setting the time-out to 0 and no-cache to true. 
[HttpCacheControlPolicy(true, 0, true)] 
public void MyController : ApiControler {... } 

Các thuộc tính phải được áp dụng cùng nhau để hoạt động. Bạn cũng có thể kiểm soát bộ nhớ đệm ở cấp độ hành động bằng cách cung cấp các quy tắc tương tự cho mỗi hành động.

Tôi vẫn chưa tìm ra giải pháp cho vấn đề 1. nhưng hãy xem không gian này để biết các bản cập nhật.

Cập nhật Tôi đã tìm thấy một giải pháp cho vấn đề 1.

  1. Đăng ký CachingHandler với container IoC của bạn (trong trường hợp của tôi nó IUnityContainer)
  2. Chích ICachingHandler vào điều khiển Web API của bạn.
  3. Để vô hiệu hóa tài nguyên, sử dụng ICachingHandler.InvalidateResource(HttpRequestMessage)

Hãy xem một ví dụ mã dưới đây. Dung dịch đã được thử nghiệm.

pubic class Bootstrapper 
{ 
    //... 

    // Create a new caching handler and register it with the container. 
    public void RegisterCache(HttpConfiguration config, IUnityContainer container) 
    { 
     var cachingHandler = new CachingHandler(config); 
     // ... 

     container.RegisterInstance<ICachingHandler>(cachingHandler); 
    } 
} 

public class ResourceContoller : ApiController 
{ 
    private ICachingHandler _cachingHandler; 

    public ResourceContoller(ICachingHandler cachingHandler) 
    { 
     _cachingHandler = cachingHandler;  
    } 

    [HttpPost] 
    public void DeleteResource(int resourceId) 
    { 
     // Do the delete 
     // ... 

     // Now invalidate the related resource cache entry  
     // Construct a http request message to the related resource 
     // HINT: The "DefaultApi" may not be your api route name, so change this to match your route. 
     // GOTCHA: The route matching mechanism is case sensitive, so be aware! 
     var relatedResource = new HttpRequestMessage(HttpMethod.Get, Url.Link("DefaultApi", new {controller = "linkedresource", action = "getlinkedresource", id: resourceId})); 

     // Invalidate the resource with the caching handler. 
     _cachingHandler.InvalidateResource(relatedResource); 
    } 
} 
0

tôi giải quyết câu hỏi # 1 của bạn sử dụng bên dưới mã. Ở đây tôi mở rộng giao diện IRoutePatternProvider. Hãy nhớ rằng, số tiền bạn trả lại trong GetRoutePattern phải khớp với số tiền bạn trả lại trong GetLinkedRoutePatterns. Chỉ khi đó việc thêm và xóa sẽ hoạt động. Hãy dùng thử.

Bên Application_Start

CachingHandler cacheHandler = new CachingHandler(GlobalConfiguration.Configuration); 
     cacheHandler.RoutePatternProvider = new CacheRoutePatternProvider(); 
     GlobalConfiguration.Configuration.MessageHandlers.Add(cacheHandler); 

Custom Class

public class CacheRoutePatternProvider : IRoutePatternProvider 
{ 
    public string GetRoutePattern(HttpRequestMessage request) 
    { 
     string path = request.RequestUri.AbsolutePath; 
     if (!path.EndsWith("/")) 
      path += "/"; 

     return path; 
    } 

    public IEnumerable<string> GetLinkedRoutePatterns(HttpRequestMessage request) 
    { 
     string path = request.RequestUri.AbsolutePath; 
     if(!path.EndsWith("/")) 
      path += "/"; 

     int segmentIndex; 
     // return each segment of the resource heirarchy 
     while ((segmentIndex = path.LastIndexOf("/")) > 0) 
     { 
      path = path.Substring(0, segmentIndex); 

      if(path.Contains("/api/")) 
       yield return path + "/"; 
     } 

     yield break; 
    } 
}