如何让 Dotnet 缓存在 API 控制器调用之间保持值?
How to get Dotnet cache to keep values between API controller calls?
我有一个 API 用于 return 在前端 UI 和非常慢的后端 API 之间缓存用户配置文件数据。缓存需要能够从后端获取数据API,将其缓存起来,然后在前端需要时将其提供给前端。
问题是当调用缓存API时,它获取数据,将其添加到缓存并return将数据发送到前端。但是,在随后的调用中,缓存声称没有数据并从慢 api 重新获取数据。 Dotnet 中是否有我必须启用的设置,以强制缓存在对 API 的单独控制器调用之间保留数据? API 就像在每次控制器调用时创建一个新缓存一样,因此缓存在服务中始终为空。
控制器
public async Task<IActionResult> getUser([FromBody] UserInput input)
{
try
{
UserProfileResponse returned = await _userService.GetUserProfile(input);
return Ok(returned);
}
catch (Exception ex)
{
return BadRequest($"Something went wrong. Message: {ex.Message}");
}
}
服务
public async Task<UserProfileResponse> GetUserProfile(UserInput input)
{
string key = Constants.USER_CACHE_PREFIX + "_" + input.Inputs.ID;
_entryOptions = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove);
// Check if the information is in the cache !!! The value is never found in the cache on subsequent calls !!!
_ = this._cache.TryGetValue(key, out UserProfileResponse value);
if (value != null)
{
return value;
}
// Prepare Endpoint Call
var Config = _configuration.GetSection(Constants.Config);
var endpoint = Config [Constants.endpoint];
var function = Constants.function;
// Call slow API service to get user profile
UserProfileResponse result = await service.SendRequest<UserProfileResponse>(input, endpoint, function);
if (result!= null)
{
this._cache.Set<UserProfileResponse>(key, result, _entryOptions);
}
return result;
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//... Code before
services.AddHttpClient();
services.AddControllers();
services.AddMemoryCache();
services.AddScoped<IMemoryCache, MemoryCache>();
services.AddScoped<IDeserializeJson, DeserializeJson>();
services.AddScoped<IUserService, UserService>();
//... Code after
}
当您调用 AddMemoryCache()
时,这应该足以设置您的依赖注入容器。您稍后调用 AddScoped<IMemoryCache, MemoryCache>()
会清除服务描述符并覆盖它。
删除对 AddScoped<IMemoryCache, MemoryCache>()
的调用应该会使其正常运行。
AddScoped
表示用每个 scope 重新创建对象。在 ASP.NET 核心的情况下,这意味着每个请求都会获得一个新的内存缓存(具有一组空的缓存条目)。 AddMemoryCache()
方法将其设置为单例,这是本例中的正确配置。
您可以看到 AddMemoryCache()
here.
的代码
我有一个 API 用于 return 在前端 UI 和非常慢的后端 API 之间缓存用户配置文件数据。缓存需要能够从后端获取数据API,将其缓存起来,然后在前端需要时将其提供给前端。
问题是当调用缓存API时,它获取数据,将其添加到缓存并return将数据发送到前端。但是,在随后的调用中,缓存声称没有数据并从慢 api 重新获取数据。 Dotnet 中是否有我必须启用的设置,以强制缓存在对 API 的单独控制器调用之间保留数据? API 就像在每次控制器调用时创建一个新缓存一样,因此缓存在服务中始终为空。
控制器
public async Task<IActionResult> getUser([FromBody] UserInput input)
{
try
{
UserProfileResponse returned = await _userService.GetUserProfile(input);
return Ok(returned);
}
catch (Exception ex)
{
return BadRequest($"Something went wrong. Message: {ex.Message}");
}
}
服务
public async Task<UserProfileResponse> GetUserProfile(UserInput input)
{
string key = Constants.USER_CACHE_PREFIX + "_" + input.Inputs.ID;
_entryOptions = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove);
// Check if the information is in the cache !!! The value is never found in the cache on subsequent calls !!!
_ = this._cache.TryGetValue(key, out UserProfileResponse value);
if (value != null)
{
return value;
}
// Prepare Endpoint Call
var Config = _configuration.GetSection(Constants.Config);
var endpoint = Config [Constants.endpoint];
var function = Constants.function;
// Call slow API service to get user profile
UserProfileResponse result = await service.SendRequest<UserProfileResponse>(input, endpoint, function);
if (result!= null)
{
this._cache.Set<UserProfileResponse>(key, result, _entryOptions);
}
return result;
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//... Code before
services.AddHttpClient();
services.AddControllers();
services.AddMemoryCache();
services.AddScoped<IMemoryCache, MemoryCache>();
services.AddScoped<IDeserializeJson, DeserializeJson>();
services.AddScoped<IUserService, UserService>();
//... Code after
}
当您调用 AddMemoryCache()
时,这应该足以设置您的依赖注入容器。您稍后调用 AddScoped<IMemoryCache, MemoryCache>()
会清除服务描述符并覆盖它。
删除对 AddScoped<IMemoryCache, MemoryCache>()
的调用应该会使其正常运行。
AddScoped
表示用每个 scope 重新创建对象。在 ASP.NET 核心的情况下,这意味着每个请求都会获得一个新的内存缓存(具有一组空的缓存条目)。 AddMemoryCache()
方法将其设置为单例,这是本例中的正确配置。
您可以看到 AddMemoryCache()
here.