2014-12-08 17 views
11

Tôi đã sử dụng Thư viện API API Web API của ASP.NET cho dự án asp.net của tôi cho API web và nó hoạt động tốt, nhưng có bộ điều khiển khác từ nơi tôi có một phương thức POST và tôi muốn làm mất hiệu lực bộ nhớ cache của tôi từ bộ điều khiển đó.Làm thế nào để vô hiệu hóa bộ nhớ cache Web API từ một Bộ điều khiển khác (Thư viện API API WebOut của ASP.NET)

[AutoInvalidateCacheOutput] 
public class EmployeeApiController : ApiController 
{ 
    [CacheOutput(ClientTimeSpan = 100, ServerTimeSpan = 100)] 
    public IEnumerable<DropDown> GetData() 
    { 
     //Code here 
    } 
} 


public class EmployeesController : BaseController 
{ 
    [HttpPost] 
    public ActionResult CreateEmployee (EmployeeEntity empInfo) 
    { 
     //Code Here 
    } 
} 

Tôi muốn vô hiệu hóa bộ nhớ cache của nhân viên khi có thêm \ cập nhật trong bộ điều khiển nhân viên.

+0

Tôi không chắc chắn nhưng [nocache] thuộc tính có thể trợ giúp. –

+0

Tôi muốn Cache, nhưng chỉ muốn làm mất hiệu lực khi có thay đổi trong bộ điều khiển nhân viên – Suresh

Trả lời

10

Đó là chút khó khăn, nhưng bạn có thể nhận được nó theo cách này:

1. Trên WebApiConfig của bạn:

// Registering the IApiOutputCache.  
var cacheConfig = config.CacheOutputConfiguration(); 
cacheConfig.RegisterCacheOutputProvider(() => new MemoryCacheDefault()); 

Chúng tôi sẽ cần nó để có được những IApiOutputCache từ GlobalConfiguration. Configuration.Properties, nếu chúng ta để thiết lập thuộc tính mặc định xảy ra thì thuộc tính với IApiOutputCache sẽ không tồn tại trên yêu cầu MVC BaseController.

2. Tạo một lớp WebApiCacheHelper:

using System; 
using System.Web.Http; 
using WebApi.OutputCache.Core.Cache; 
using WebApi.OutputCache.V2; 

namespace MideaCarrier.Bss.WebApi.Controllers 
{ 
    public static class WebApiCacheHelper 
    { 
     public static void InvalidateCache<T, U>(Expression<Func<T, U>> expression) 
     { 
      var config = GlobalConfiguration.Configuration; 

      // Gets the cache key. 
      var outputConfig = config.CacheOutputConfiguration(); 
      var cacheKey = outputConfig.MakeBaseCachekey(expression); 

      // Remove from cache. 
      var cache = (config.Properties[typeof(IApiOutputCache)] as Func<IApiOutputCache>)(); 
      cache.RemoveStartsWith(cacheKey); 
     } 
    } 
} 

3. Sau đó, gọi nó từ hành động EmployeesController.CreateEmployee của bạn:

public class EmployeesController : BaseController 
{ 
    [HttpPost] 
    public ActionResult CreateEmployee (EmployeeEntity empInfo) 
    { 
     // your action code Here. 
     WebApiCacheHelper.InvalidateCache((EmployeeApiController t) => t.GetData()); 
    } 
} 
+0

Cảm ơn, nhưng tôi đang sử dụng ASP.Net 4.0 và WebApi.OutputCache.V2 chỉ có sẵn trong ASP.net 4.5 bạn có bất kỳ gợi ý nào khác cho làm việc với ASP.Net 4.0? hoặc tôi phải nâng cấp giải pháp của mình lên asp.net 4.5 – Suresh

+0

Tôi không biết, tôi chưa từng sử dụng WebApi.OutputCache với ASP .NET 4.0. – giacomelli

+0

Dường như giải pháp của bạn sẽ làm việc cho 4,5 vì nó không giải quyết được vấn đề của tôi nhưng chấp nhận là câu trả lời hy vọng sẽ giúp đỡ người khác. – Suresh

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