Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ResponseCache不在net core 3.1中工作_C#_.net_Caching_.net Core_Browser - Fatal编程技术网

C# ResponseCache不在net core 3.1中工作

C# ResponseCache不在net core 3.1中工作,c#,.net,caching,.net-core,browser,C#,.net,Caching,.net Core,Browser,我试图学习.NETCore3.1中的响应缓存。但它没有像我希望的那样起作用。我在ChromeDevTool中查看了网络,它显示了带有缓存控制的响应头:无缓存,无存储 我还发现响应头在Actionfilter中带有HeaderCacheControl{public,max age=100}。这是我期望的值,但浏览器中的实际响应标题是无缓存 启动类: public void配置服务(IServiceCollection服务) { services.addResponseCache(选项=> { op

我试图学习.NETCore3.1中的响应缓存。但它没有像我希望的那样起作用。我在ChromeDevTool中查看了网络,它显示了带有
缓存控制的响应头:无缓存,无存储

我还发现响应头在Actionfilter中带有
HeaderCacheControl{public,max age=100}
。这是我期望的值,但浏览器中的实际响应标题是
无缓存

启动
类:

public void配置服务(IServiceCollection服务)
{
services.addResponseCache(选项=>
{
options.SizeLimit=1024;
options.MaximumBodySize=1024*1024*100;
options.useCaseSensitivePath=false;
});
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{   
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCookiePolicy();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseResponseCaching();
app.UseEndpoints(端点=>
{
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller=Home}/{action=Index}/{id?}”);
});
}
控制器:

[ResponseCache(持续时间=100,NoStore=false)]
公共IActionResult索引()
{
返回视图();
}

这是正常行为,如果页面是否从磁盘缓存中检索,则会有多个因素影响

我将尝试列出用户请求页面的常见场景,以及页面是否被缓存

  • AddResponseCaching
    UseResponseCaching
    控制服务器端缓存,而
    responsecaching属性
    通过设置适当的头控制客户端缓存
  • 我喜欢通过如下设置配置文件来控制客户端缓存:

    services.addcontrollerswithview(选项=>
    {
    options.CacheProfile.Add(“缓存”,新的CacheProfile()
    {
    持续时间=120,
    位置=响应确认位置。任何,
    VaryByHeader=“cookie”
    });
    options.CacheProfile.Add(“NoCaching”,新的CacheProfile()
    {
    NoStore=正确,
    位置=响应确认位置。无
    });
    })
    
    你是这样使用它的:

    [ResponseCache(CacheProfileName=“Caching”)]
    
  • 当使用没有证书的HTTPS或证书无效时,Chrome会阻止任何类型的缓存(在开发过程中,系统会提示您信任开发证书,以便在HTTPS上工作)

  • 浏览器在开发工具打开时禁用缓存,它们通常发送一个
    缓存控件:no Cache

  • 在chrome上点击reload(Ctrl+F5)也会禁用缓存,并发送一个
    缓存控制:max age=0
    头和您的请求,该请求得到服务器的尊重

  • 如果您希望测试缓存是否正常工作,请执行以下操作:

  • 打开Chrome开发工具并取消选中
    禁用缓存
    复选框(如果选中)

  • 像平常一样请求页面

  • 不要尝试通过引用同一页面的页面中的锚标记请求同一页面(您应该看到该页面是从磁盘缓存中检索的)(如果符合以下条件)

  • 您还可以从另一个页面导航到(缓存激活的)页面,如果该页面已缓存,则将从磁盘缓存中提取该页面(如果符合以下条件)

  • 带有表单和/或任何类型授权的页面将不会被缓存。包含反伪造令牌的页面将与
    缓存控制
    Pragma
    标题一起发送到
    无缓存
    。您可以看到在上缓存的所有条件

  • 还有一些工具,如Fiddler和Postman,默认情况下发送
    无缓存


  • 管道的顺序不正确,您在
    UseEndpoints
    之前使用
    ResponseCaching
    中间件,而不是在开始时。提供静态文件和路由必须在身份验证和授权之前进行。谢谢。我听从了你的建议,确定了中间件的顺序。也在docs()中找到了该信息。但是,修复后我仍然得到“没有缓存,没有存储”。非常感谢。我的问题的解决方案是您方案列表中的第六点。当我注释掉“表单”和反伪造标记时,效果很好。@YuHsu如果这个答案解决了您的问题,请将其标记为已接受的答案。