我的项目中有此类,我想使用内存缓存来加快速度:
[AttributeUsage(validOn: AttributeTargets.Class | AttributeTargets.Method)]
public class ApiKeyAuthAttribute : Attribute, IAsyncActionFilter
{
private readonly IMemoryCache _cache;
private string accessKey;
private string apiKey;
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
context.HttpContext.RequestServices.GetRequiredService<MemoryCache>();
var connection = context.HttpContext.RequestServices.GetRequiredService<ApiKeyContext>();
if (!context.HttpContext.Request.Headers.TryGetValue(key:"ApiKey", out var potentialApiKey))
{
context.Result = new UnauthorizedResult();
return;
}
context.HttpContext.Request.Headers.TryGetValue(key: "Client", out var apiClient);
if (!_cache.TryGetValue<string>(apiClient, out accessKey))
{
apiKey = connection.ApiKey.Where(x => x.Client == apiClient.ToString()).Select(x => x.Apikey1).SingleOrDefault();
}
context.HttpContext.Request.Headers.TryGetValue(key: "ApiKey", out var clientApiKey);
if (!string.IsNullOrEmpty(apiKey))
{
if (!apiKey.Equals(clientApiKey))
{
context.Result = new UnauthorizedResult();
return;
}
}
else
{
context.Result = new UnauthorizedResult();
return;
}
await next();
}
}
这是我的启动类ConfigureService方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApiKeyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ApiKey")));
services.AddMemoryCache();
}
我可以注入EntityFramework上下文并对其进行访问,而不会出现任何问题,并且可以从数据库中提取密钥以使所提供的客户端与APIKey相匹配。现在,我想通过将apiKey放入内存缓存中来提高密钥检索的速度。但是,当我尝试使用GetRequiredService()请求服务时,出现此错误:
没有注册类型'Microsoft.Extensions.Caching.Memory.MemoryCache'的服务。
我无法在构造函数中注入内存缓存,因为接口实现不允许使用接口。那么,如何在context.HttpContext.RequestServices上使用GetRequiredServices方法设置要注入的内存缓存?
更改
context.HttpContext.RequestServices.GetRequiredService<MemoryCache>();
至
context.HttpContext.RequestServices.GetRequiredService<IMemoryCache>();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句