如何获取点网缓存以保持API控制器调用之间的值?

如何解决如何获取点网缓存以保持API控制器调用之间的值?

我有一个API,用于在前端UI和速度很慢的后端API之间返回缓存用户配置文件数据。缓存需要能够从后端API获取数据,对其进行缓存,然后在前端需要它时将其提供给前端。

问题在于调用缓存API时,它将获取数据,将其添加到缓存中并将数据返回到前端。但是,在后续调用中,缓存声称没有数据,并从慢速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 Core,这意味着每个请求都将获得一个新的内存缓存(带有一组空的缓存条目)。 AddMemoryCache()方法将其设置为单例,在这种情况下,这是正确的配置。

您可以看到AddMemoryCache() here的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?