在移动设备上禁用缓存

时间:2013-01-11 09:05:24

标签: c# iphone asp.net caching

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

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

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

如果我进入safari设置并删除co​​okies&数据/网络数据,然后转到网页,所有下拉列表填充和ajax调用工作(请等待弹出窗口显示)。我已尝试在page_load上将以下代码行添加到我的母版页,但它没有用。

Response.Cache.SetNoStore();

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

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

1 个答案:

答案 0 :(得分:0)

你认为这与缓存相关的理论是正确的 - 在没有提供缓存控制头的情况下,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的集成模式,则可以使用<system.web>代替:

<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" />