英文:
.NET 7 OutputCache Not Using Named Policies
问题
我正在尝试理解 OutputCaching,但遇到了一些问题:
- 缓存确实起作用,但应用于所有控制器端点,即使它们没有该属性。我认为这可能是由于 AddBasePolicy() 导致的,但我更困惑的是我的下一个问题。
- 我的命名策略似乎无法在 GetElementCached 方法上识别,始终应用 5 秒过期的基本策略。如果我删除基本策略,缓存根本不起作用。
我已经按照以下方式注册了服务和中间件:
.AddOutputCache(options =>
{
options.AddBasePolicy(builder =>
builder.Expire(TimeSpan.FromSeconds(5)));
options.AddPolicy("DemoCache", builder =>
builder.Expire(TimeSpan.FromSeconds(20)));
})
然后,我创建了两个返回测试数据的控制器方法:
[HttpGet("{index}/get-element-cache")]
[OutputCache(PolicyName = "DemoCache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public async Task<IActionResult> GetElementCached(int index)
{
return Ok(_myDb[index]);
}
[HttpGet("{index}/get-element-no-cache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public async Task<IActionResult> GetElementNoCache(int index)
{
return Ok(_myDb[index]);
}
我已经检查了示例和文档,并且对于为什么我的策略不起作用感到困惑,特别是基本策略有效,可以更改,使我相信我已正确配置它。
英文:
I am trying to understand OutputCaching but I am running into some problems:
- Caching does work, but it's applying to all controller endpoints even if they don't have the attribute. I think this might be due to AddBasePolicy() but I'm more confused about my next point
- My named policy does not seem to be recognised on the GetElementCached method, the base policy of 5 second expiry always applies. If I remove the base policy caching does not work at all
I have registered the service and subsequently middleware as follows:
.AddOutputCache(options =>
{
options.AddBasePolicy(builder =>
builder.Expire(TimeSpan.FromSeconds(5)));
options.AddPolicy("DemoCache", builder =>
builder.Expire(TimeSpan.FromSeconds(20)));
})
I have then created two controllers returning test data:
[HttpGet("{index}/get-element-cache")]
[OutputCache(PolicyName = "DemoCache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public async Task<IActionResult> GetElementCached(int index)
{
return Ok(_myDb[index]);
}
[HttpGet("{index}/get-element-no-cache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public async Task<IActionResult> GetElementNoCache(int index)
{
return Ok(_myDb[index]);
}
I've checked worked examples and the documentation and I'm confused why my policy won't apply especially given the base policy works and can be changed making me believe I've configured it correctly.
答案1
得分: 0
-
创建策略时,在调用 AddOutputCache 时指定缓存配置,即使它们没有该属性。
-
对于多个端点,创建策略以在调用 AddOutputCache 时指定缓存配置。基本策略为一组端点提供默认的缓存配置。您可以阅读配置多个端点或页面了解更多信息。
-
我的命名策略似乎在 GetElementCached 方法上没有被识别。
-
我们使用默认模板创建了一个 ASP.NET Core Web API 项目,然后在添加基本缓存之前,让我们运行我们的应用程序并访问默认的 Weather Forecast。我们注意到每次刷新时,我们都会得到不同的结果。这是因为默认代码会随机生成结果。
-
然后对 Program.cs 进行两个小更改:将输出缓存中间件添加到服务集合和请求管道中,如下所示:
builder.Services.AddOutputCache(options => { options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromSeconds(5))); options.AddPolicy("DemoCache", builder => builder.Expire(TimeSpan.FromSeconds(20))); }); ... app.UseOutputCache();
-
然后测试 WeatherForecast 以查看结果:
[HttpGet("{index}/get-element-cache")] [OutputCache(PolicyName = "DemoCache")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] public IEnumerable<WeatherForecast> GetElementCached() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } [HttpGet("{index}/get-element-no-cache")] [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] public IEnumerable<WeatherForecast> GetElementNoCache() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); }
-
结果:在再次访问 URL 后,我们可以看到响应现在被缓存了 20 秒:
英文:
> applying to all controller endpoints even if they don't have the
> attribute
Create policies when calling AddOutputCache to specify caching configuration that applies to multiple endpoints. A base policy provides default caching configuration for a collection of endpoints.You can read Configure multiple endpoints or pages to know more.
> My named policy does not seem to be recognised on the GetElementCached
> method,
I create an ASP.NET Core Web API project using the default template, before we add the basic caching, let’s run our app and hit the default Weather Forecast . We notice that each time we refresh, we get a different result. This is due to the default code randomizing the results.
Then make two small changes to Program.cs: add the output caching middleware to the service collection and request pipeline respectively. :
builder.Services.AddOutputCache(options =>
{
options.AddBasePolicy(builder =>
builder.Expire(TimeSpan.FromSeconds(5)));
options.AddPolicy("DemoCache", builder =>
builder.Expire(TimeSpan.FromSeconds(20)));
});
...
app.UseOutputCache();
Then test WeatherForecast to see the result,:
[HttpGet("{index}/get-element-cache")]
[OutputCache(PolicyName = "DemoCache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public IEnumerable<WeatherForecast> GetElementCached()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet("{index}/get-element-no-cache")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
public IEnumerable<WeatherForecast> GetElementNoCache()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
Result: after we hit the URL again, we can see that the response is being cached for 20 seconds now :
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论