我继承了一个.NET C# MVC应用程序。我注意到,当用户使用浏览器内置的“后退”和“前进”按钮时,不同的页面与服务器的交互方式不同。有些页面会命中服务器,有些则不会。我使用Postman来命中各个URL,发现不同的页面返回不同的响应标头。
1.缓存控制:私人的
1.缓存控制:公共,无存储,最长生存期=0
第一组中的页面缓存在浏览器的“private”缓存中。通过“后退”或“前进”按钮将此页面加载到浏览器中时,不会命中服务器。
第二个控制字符串有点冲突,但是最具限制性的指令no-store覆盖了。这些页面在每次加载时都会命中服务器。
我已经搜索了代码库。我已经在各种页面模板标记文件中找到了相关的 meta标记,但我特别寻找header。而且,元标记都是相同的,因此无法解释不同页面中的不同标题。
IIS未配置为添加此标头。此外,当我在Visual Studio / IIS Express之外的调试模式下运行此应用程序时,我看到这些标头随响应一起发送。不同的页有不同的标头。
我在服务器上找不到任何发出这些标头的显式代码(我搜索了Response.AddHeader,但没有找到任何东西)所以我想可能有不同的MVC模板的不同配置,这些模板隐式地生成了这些头文件?这有意义吗?(我对MVC没有太多的经验。)我会继续寻找,但是如果你有MVC的知识,可以给我指明正确的方向,我真的会很感激。
我继续调查这件事。正如阿列克谢·列文科夫指出的,Angular正在执行客户端。不是合适的地方。
这是一个处理页面请求的调试会话的图像。此时Response.Headers集合中正好有两个头。
执行此语句后,浏览器收到的响应包含更多的头。()方法不是我的代码,所以我无法跟踪它。()方法会对某个声明性配置做出React,我不是Angular.jsMaven,我对MVC也不是很在行,我可能遗漏了一些非常基本的东西。
在这个事务中,return View()语句之后没有执行任何内容。跳过该语句,跳过方法的右括号,内容返回到客户端。
Postman显示了11个响应头,包括我特别感兴趣的那个。
现在,我进入了一个不同的请求,它返回了一个不同的Cache-Control头。同样,我们在Response.Headers集合中看到了相同的两个头。
然而,View方法返回13个响应头和一个***不同的***Cache-Control头:
这里有一条线索:返回不同标题的不同页面被分组到不同的控制器中。一个控制器返回Cache-Control:private,而另一个控制器返回Cache-Control:公共、无存储、最长生存期=0。
我想,最终,问题归结为以下几点:如何在MVC中定义控制器以在响应中返回特定的标头?(就像我说的,我不是MVCMaven,所以这可能是一个非常冗长的演示,以得到一个非常基本的问题。感谢您的帮助!)
1条答案
按热度按时间7y4bm7vi1#
我相信这就是答案。它是控制器上的一个元标记。(作为一个声明性标记,在单步执行代码时不会看到它。检查源代码是必要的,当然,它有助于了解您要查找的内容。现在我知道了!)
另一个控制器没有任何这样的元标记。似乎不指定此元标记会导致Cache-Control:private,它允许浏览器在本地缓存中保留页面,以便在不访问服务器的情况下进行“后退”和“前进”导航。
如上面的代码示例所示指定元标记将导致Cache-Control:public,no-store,max-age=0(这是一个奇怪的缓存控制值,其中public与no-store冲突,但后者胜出,因为它是限制性更强的属性。)