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