gpt4 book ai didi

ASP.Net Core 2.0 - ResponseCaching 中间件 - 不在服务器上缓存

转载 作者:行者123 更新时间:2023-12-02 12:10:33 29 4
gpt4 key购买 nike

我想在 asp.net core 2.0 中使用服务器端响应缓存(输出缓存),并发现了 Response Caching Middleware并想尝试一个全新的 asp.core mvc 项目。

这是上面链接中的描述,这让我认为这可以像输出缓存一样使用。

The middleware determines when responses are cacheable, stores responses, and serves responses from cache.

这是我的startup.cs的样子。

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddMvc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCaching();

if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}

这是 HomeController.cs

[ResponseCache(Duration = 60)]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}

public IActionResult About()
{
ViewData["Message"] = "Your application description page.";

return View();
}

public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";

return View();
}

public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

_Layout.cshtml 文件底部还有一个时间戳,这样我就可以知道页面何时呈现,如下所示。

<p>&copy; 2018 - ResponseCachingMiddleware - @DateTime.UtcNow</p>

缓存控制 header 似乎很好,这是我加载页面时在 header 中得到的内容,但时间戳在每秒每次刷新时不断更新。

Cache-Control:public,max-age=60

我从 MS 文档中了解到的是,响应缓存中间件是服务器端缓存机制,负责在 Response Caching 时缓存响应。似乎只是一个过滤器来操纵响应 header 进行缓存。

无法判断我的理解或代码是否有问题,我想提示自从我开始使用 ASP.Net Core 进行原型(prototype)设计以来,我经常有这种感觉。也许您还可以建议更好的资源作为副主题。

我之前看过这篇文章 ASP.NET Core 2.0 - Http Response Caching Middleware - Nothing cached

也检查了这一点,但似乎唯一的区别是我使用的是 mvc。 https://github.com/aspnet/ResponseCaching/blob/dev/samples/ResponseCachingSample/Startup.cs

谢谢

编辑:我在输出窗口中看到下面的消息,除了我已经检查过响应缓存中间件的几个地方之外,在谷歌上找不到任何相关信息。

Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware:Information: The response could not be cached for this request.

注意:我希望我可以创建#response-caching-middleware 标记。不确定#responsecache 是否相关。

最佳答案

我也遇到了同样的问题,我正要费尽心思,我设置了 app.UseResponseCaching();以及 services.AddResponseCaching();并添加ResponseCache除了我的操作之外,尽管 cache-controll 与 Microsoft 官方文档中所说的完全一样从服务器返回的响应中正确设置了 header ,但服务器端仍然没有缓存任何内容。

经过几个小时的努力解决这个问题,我弄清楚了问题出在哪里以及为什么服务器上没有缓存。

浏览器默认设置cache-controll值为 max-age=0对于该请求(如果该请求不是由后退或前进引起的),即使您设置了 cache-controller在您的回复中正确添加 ResponseCachecache-controller 以来,您的操作(或 Controller )之上的属性通过请求发送设置为 max-age=0 ,服务器无法缓存响应,我认为这也必须添加到响应缓存限制列表中

无论如何,您可以通过在调用app.UseResponseCaching();之前添加几行代码来覆盖浏览器的默认行为。另一方面,您需要添加自定义中间件来修改请求 cache-control调用之前的 header 值app.UseResponseCaching(); .

请参阅下面的代码,为我工作希望也为您工作

 app.Use(async (ctx, next) =>
{
ctx.Request.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(60)
};
await next();
}
);
app.UseResponseCaching();

为了确保 ResponseCaching 按预期工作,您还可以使用 postman,但必须在设置中将“发送无缓存 header ”设置为关闭,请参见下图

enter image description here

关于ASP.Net Core 2.0 - ResponseCaching 中间件 - 不在服务器上缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48232911/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com