Как аннулировать кеш веб-API от другого контроллера (ASP.NET Web API CacheOutput Library)

Я использовал ASP.NET Web API CacheOutput Library для моего проекта asp.net для веб-API, и он отлично работает, но у меня есть другой контроллер, откуда у меня есть метод POST, и я хотел бы аннулировать кеш с этого контроллера.

[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
    }
}

Я хочу сделать недействительным кэш сотрудников, если в контроллере employee есть add\update.

Ответ 1

Это немного сложно, но вы можете получить его таким образом:

1. На вашем WebApiConfig:

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

Нам понадобится его, чтобы получить IApiOutputCache из GlobalConfiguration.Configuration.Properties, если мы разрешим установку свойств по умолчанию, свойство с IApiOutputCache не будет существовать в запросе MVC BaseController.

2. Создайте класс 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. Затем вызовите его из действия EmployeesController.CreateEmployee:

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