【问题标题】:Disable cache on mobiles禁用手机缓存
【发布时间】:2013-01-11 09:05:24
【问题描述】:

我正在用 c# 创建一个 asp.net Web 应用程序,在 iPhone 4 和 5 上查看页面时遇到了一个小问题(不确定其他手机,因为我没有收到其他手机用户的报告)。

在桌面浏览器上查看页面时,一切正常。发生的情况是用户在文本框中输入他们的电子邮件地址并单击按钮。我在通过 ajax 调用 web 方法的按钮上有一些 Javascript JQuery,web 方法返回 json 中的 ID 和名称列表 - 然后该按钮在网页上填充此信息的下拉框。

用户可以通过网站的不同部分将信息添加到数据库中,当他们单击上述按钮时,返回的列表应该更大并且包含新信息。但是我在 iphone 5 上注意到,当我返回页面时,似乎没有发生 ajax 调用(它发生时会短暂显示一个弹出窗口)并且下拉框不包含数据库中的新信息。我相信它只是显示来自手机 CACHE 的信息。

如果我进入 safari 设置并删除 cookie 和数据/网络数据,然后转到网页,瞧,所有下拉列表都已填充,并且 ajax 调用正常工作(请等待弹出显示)。我已尝试将以下代码行添加到 page_load 上的母版页,但没有成功。

Response.Cache.SetNoStore();

我还有什么需要做的吗?正如我所说,该网站适用于桌面浏览器,我不是移动开发人员(我什至不使用手机进行网页浏览)所以不确定问题是什么或如何在我的代码中解决它。

非常感谢任何帮助/建议。

【问题讨论】:

  • 尝试将查询字符串变量添加到 ajax 调用的地址。更改每个请求的变量,这样浏览器就不会认为它是可缓存的。我对这个问题的回答中描述的原则(但并不完全相同):stackoverflow.com/questions/14231872/…

标签: c# iphone asp.net caching


【解决方案1】:

您认为这与缓存相关的理论是正确的 - iOS 6 在没有提供缓存控制标头(包括 POST)的情况下会更加积极地缓存。请参阅Is Safari on iOS 6 caching $.ajax results? 了解更多信息。

我们遇到了同样的问题,我们为此采取的方法是向站点添加一个 HttpModule,该站点始终为任何 POST 请求设置此标头:

public class DisablePostCachingModule : IHttpModule
{
    private HttpApplication _context;
    public void Init(HttpApplication context)
    {
        _context = context;
        _context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose()
    {
    }

    private void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request.HttpMethod == "POST")
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }
    }
}

我们将它连接到 Web.config 中,如下所示,它为我们解决了问题:

<configuration>
  <system.webServer>
    <modules>
      <add name="DisablePostCachingModule" type="Full.Namespace.To.DisablePostCachingModule, AssemblyName" />
    </modules>
  </system.webServer>
</configuration>

请注意,如果您不使用 IIS7 的集成模式,您可以使用 &lt;system.web&gt; 代替:

<configuration>
  <system.web>
    <httpModules>
      <add name="DisablePostCachingModule" type="Full.Namespace.To.DisablePostCachingModule, AssemblyName" />
    </httpModules>
  </system.web>
</configuration>

显然,在上述两种情况下,您都需要将Full.Namespace.To 更新为您用于该模块的任何命名空间,并将AssemblyName 更新为该模块所在的程序集的名称。比如:

<add name="DisablePostCachingModule" type="Acme.HttpModules.DisablePostCachingModule, Acme.Core" />

【讨论】:

  • 非常感谢以上内容,我一定会将其添加进去。safari/ajax 链接乍一看非常积极,因此本周末会消化。直到星期一我才能再次对其进行全面测试,所以如果我能正常工作,我肯定会接受你的回答。
  • 你能给我一个例子,说明你如何在 web.config 中连接它吗?抱歉,这对我来说是新的。
  • 非常感谢。如何实现它更有意义。非常感谢
  • 我已经在周末进行了更改,今天早上进行了测试,似乎已经解决了这个问题。我还在您发送给我的链接中实现了 ajax 设置中的一行。谢谢
猜你喜欢
  • 2014-07-08
  • 2020-02-23
  • 1970-01-01
  • 2017-07-13
  • 2011-03-11
  • 2014-08-12
  • 2011-11-03
  • 2013-11-15
  • 2011-06-14
相关资源
最近更新 更多