2017-08-30 145 views
4

我想使用“Microsoft.AspNetCore.ResponseCaching”包在我的web api中实现响应缓存。ASP.NET Core 2.0 Web API响应缓存

我使用邮差来测试应用和验证头等等

正确的头被指定的最大年龄,但邮递员产生似乎请求从API,而不是使用缓存的响应。响应时间根本不变,如果我调试控制器,我可以看到它每次都被请求命中。

启动类ConfigureServices(连同其他东西):

services.AddResponseCaching(); 

启动类配置(与其他东西一起):

app.UseResponseCaching(); 

app.UseMvc(); 

控制器动作:

[HttpGet("{employeeNr}", Name = EmployeeAction)] 
    [ResponseCache(Duration = 50)] 
    [Produces(typeof(EmployeeDto))] 
    public async Task<IActionResult> GetEmployee(SpecificEmployeeParameters parameters) 
    { 
     if (!await _employeeRepository.EmployeeExists(parameters.EmployeeNr)) return NotFound(); 

     if (!_typeHelperService.TypeHasProperties<EmployeeDto>(parameters.Fields)) 
      return BadRequest(); 

     var entity = await _employeeRepository.GetEmployee(parameters.EmployeeNr); 

     var result = Mapper.Map<EmployeeDto>(entity); 
     return Ok(result.ShapeData(parameters.Fields)); 
    } 

响应头来自邮差:

cache-control →private,max-age=50 
content-type →application/json; charset=utf-8 
date →Wed, 30 Aug 2017 11:53:06 GMT 

回答

5

修复了这个问题。上面的代码是可以的! 邮差是由一个设置防止缓存。

要解决此行为去邮差设置:

General -> Headers -> Send no-cache header -> Set to "OFF" 
+0

我碰到这也。虽然RFC在浏览器请求具有no-cache/no-store头时需要这种缓存行为,但对于像ISP或CDN这样的中间缓存来说,它确实是有意义的。如果服务器是内容的拥有者并且知道它没有更改,则不应该强制重新呈现服务器。这是我写的一个扩展,它允许您关闭ASP.Net Core的ResponseCache的默认行为:github.com/speige/AspNetCore.ResponseCaching.Extensions nuget.org/packages/AspNetCore.ResponseCaching.Extensions –