ASP.NET Core 2.0使用ResponseCache报错的问题求助
首先,咱们来拆解你遇到的错误:InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.ResponseCaching.Internal.IResponseCachingPolicyProvider' from root provider。这个问题的根源是你手动注册了IResponseCachingPolicyProvider为Scoped服务,但ResponseCaching中间件是在根服务提供者(非作用域)中尝试解析它,而根容器无法直接解析Scoped生命周期的服务,这就导致了报错。
正确的ResponseCaching配置步骤
你不需要手动绑定IResponseCachingPolicyProvider,ASP.NET Core已经提供了官方的注册方法来处理所有相关服务的生命周期:
修正Startup.cs中的服务注册
删掉你添加的services.AddScoped<IResponseCachingPolicyProvider, ResponseCachingPolicyProvider>();,替换成官方的ResponseCaching服务注册:public void ConfigureServices(IServiceCollection services) { // 注册ResponseCaching所需的所有服务(包括正确的生命周期配置) services.AddResponseCaching(); services.AddMvc(); }中间件顺序保持不变
你的中间件配置是对的,UseResponseCaching必须在UseMvc之前,这样才能拦截并处理响应缓存逻辑:public void Configure(IApplicationBuilder application) { application .UseResponseCaching() .UseMvc(); }
实现旧版[OutputCache(NoStore = true, Duration = 0)]的效果
旧版的这个特性是告诉客户端和服务器都不要缓存响应,在ASP.NET Core中对应的配置是:
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] public IActionResult YourAction() { // 你的业务逻辑 return View(); }
Location = ResponseCacheLocation.None:会向客户端发送Cache-Control: no-store, no-cache等响应头,禁止客户端缓存NoStore = true:确保服务器本身也不会存储这个响应的缓存
这样配置后,就完全等价于旧版ASP.NET中[OutputCache(NoStore = true, Duration = 0)]的效果了。
内容的提问来源于stack exchange,提问作者Green_qaue

