C# 带缓存的ODataWebAPI

C# 带缓存的ODataWebAPI,c#,caching,asp.net-core,asp.net-web-api2,odata,C#,Caching,Asp.net Core,Asp.net Web Api2,Odata,我有个问题,希望有人能帮我:) 我正在使用ODataWebAPI(Microsoft.AspNetCore.OData),我想做一些请求缓存。我有以下考虑: 我知道我的数据每15分钟才更新一次,也就是说我会使缓存失效 我尝试了Microsoft.AspNetCore.responseCache,只要没有身份验证头,它对我就有效。但我的请求有一半包含身份验证头,其中包含来自可信服务(所有内部服务/用户)的经过身份验证的用户的签名JWT 我试图使用一个资源过滤器,但我这里遇到的问题是OData控制

我有个问题,希望有人能帮我:)

我正在使用ODataWebAPI(Microsoft.AspNetCore.OData),我想做一些请求缓存。我有以下考虑:

  • 我知道我的数据每15分钟才更新一次,也就是说我会使缓存失效
  • 我尝试了Microsoft.AspNetCore.responseCache,只要没有身份验证头,它对我就有效。但我的请求有一半包含身份验证头,其中包含来自可信服务(所有内部服务/用户)的经过身份验证的用户的签名JWT
  • 我试图使用一个资源过滤器,但我这里遇到的问题是OData控制器返回可查询文件,我认为缓存它们是没有意义的,而且在请求结束时处理它们也是有意义的
这是我的OData控制器,非常简单:

    [ODataRoute()]
    public IQueryable<T> Get(ODataQueryOptions opts)
    {
        return _dbContext.Set<T>().AsQueryable();
    }
是的,我意识到路径可能不是最好的钥匙,我会接受建议:)

任何关于我如何在我的问题上取得进展的帮助都将不胜感激!多谢各位

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Memory;

namespace Service.Helpers
{
    public class ResourceCacheFilter : IActionFilter
    {
        private IMemoryCache _memoryCache;

        public ResourceCacheFilter(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var path = context.HttpContext.Request.Path + context.HttpContext.Request.QueryString;
            if (_memoryCache.TryGetValue(path, out ObjectResult value))
            {
                context.Result = value;
            }
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.Exception != null) return;

            var path = context.HttpContext.Request.Path + context.HttpContext.Request.QueryString;
            var cacheEntryOpts = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(15));
            _memoryCache.Set(path, context.Result, cacheEntryOpts);
        }
    }
}