我为我的asp.net项目的Web API使用了ASP.NET Web API CacheOutput库,它可以正常工作,但是在我有POST方法的地方有另一个 Controller ,我想使该 Controller 的缓存无效。

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

当员工 Controller 中有add\update时,我想使员工缓存无效。

最佳答案

这有点棘手,但是您可以通过以下方式获得它:

1.在您的WebApiConfig上:

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

如果我们让默认属性的设置发生,我们将需要它从GlobalConfiguration.Configuration.Properties获取IApiOutputCache,带有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());
    }
}

10-07 18:15