您认为这与缓存相关的理论是正确的 - 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" />