OutputCache无法正常工作 - > ASP.NET MVC5

时间:2017-02-17 16:21:28

标签: asp.net-mvc caching outputcache http-caching

我的输出缓存似乎没有按预期工作 这是一个控制器方法,用于返回我网站的默认页面。 我把它缓存了40秒(测试 - >在实时它缓存更长时间)

[OutputCache(Duration = 40, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "none")]
public async Task<ActionResult> Index(){
......
}

我有2个问题

第一

当我第一次点击端点时,它在服务器上正确缓存并返回以下响应头(如预期的那样)。

status:200
Cache-Control:"private, max-age=40, s-maxage=0"

当我打开新的浏览器标签并在5秒后粘贴到同一个端点时。它进入服务器并返回带有内容的200和以下标题

status:200
Cache-Control:"private, max-age=63622944145, s-maxage=63622944105"

这对我来说似乎不正确。我希望它使用If-modified-since标头向服务器发送请求。如果自标题中的时间以来重建了缓存的响应,则它将返回200 +内容,否则返回304.因此,在这种情况下,由于服务器缓存未重建,因此它应返回304.此外,因为max-age如此之大它现在无效,因此立即被视为陈旧。 我做错了什么......?

其次

我在我的Index方法中放了一个断点,然后从浏览器中点击端点。在我第一次点击Index端点时,会遇到断点。对端点的后续请求不会按预期在下一个40秒内到达断点。但是,如果我添加&#34; /&#34;在浏览器中我的端点结束时,它会点击断点而忽略缓存。 我该如何避免这种情况..?

1 个答案:

答案 0 :(得分:0)

我刚遇到同样的问题。 github上有一个帖子(我认为这是一个bug): https://github.com/Microsoft/dotnet/issues/330

我的解决方案如下: (1)下载并安装.Net 4.6.2 Dev Framework包。转到项目的“属性”页面,然后从列表中选择它或转到“安装其他框架”... (2)将您的应用程序定位到4.6.2。您需要重新启动项目(它有一条消息)。 (3)转到web.config并确保设置了这些值:

<system.web>
<compilation targetFramework="4.6.2" />
<httpRuntime targetFramework="4.6.2" />

(4)最后,转到NuGet Package Installer并安装以下软件包(搜索它):Microsoft.AspNet.OutputCache.OutputCacheModuleAsync

问题对我来说是固定的。我希望这会有所帮助。

问题2:删除尾部斜杠

在web.config的正确部分中添加此代码:

<system.webServer>
<rewrite>
  <rules>
    <rule name="Remove trailing slash" enabled="true" stopProcessing="true">
      <match url="(.*)/$" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Redirect" redirectType="Permanent" url="{R:1}" />
    </rule>
  </rules>
</rewrite>
<validation validateIntegratedModeConfiguration="false" />

相关问题