2

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

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

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

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

Response.Cache.SetNoStore();

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

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

4

1 回答 1

0

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

我们遇到了同样的问题,我们为此采取的方法是向站点添加一个 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" />
于 2013-01-11T09:50:59.350 回答