我正在用c#创建一个asp.net web应用程序,并且在iPhone 4和5上查看页面时遇到了一些问题(不确定其他手机,因为我没有其他移动用户的报告)。
在桌面浏览器上查看页面时,一切正常。会发生什么是用户在文本框中输入他们的电子邮件地址并单击按钮。我在按钮上有一些Javascript JQuery,通过ajax调用web方法,web方法返回json中的ID和名称列表 - 然后该按钮会在网页上填充一个包含此信息的下拉框。
用户可以通过站点的不同部分向数据库添加信息,当他们单击上面的按钮时,返回的列表应该更大并包含新信息。不过我在iphone 5上注意到,当我回到页面时,似乎没有发生ajax调用(当它发生时它会短暂地显示一个弹出窗口)并且下拉框不包含数据库中的新信息。我相信它只是显示来自手机CACHE的信息。
如果我进入safari设置并删除cookies&数据/网络数据,然后转到网页,所有下拉列表填充和ajax调用工作(请等待弹出窗口显示)。我已尝试在page_load上将以下代码行添加到我的母版页,但它没有用。
Response.Cache.SetNoStore();
还有什么我需要做的吗?正如我所说,该网站适用于桌面浏览器,我不是移动开发人员(我甚至不使用手机进行网页浏览)所以不确定问题是什么或我如何在我的代码中修复它。
非常感谢任何帮助/建议。
答案 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" />