2013-01-11 51 views
2

我在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(); 

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

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

+0

尝试将一个查询字符串变量添加到您的ajax调用的地址。更改每个请求的变量,以便浏览器不会认为它是可缓存的。原理描述(但它不完全一样)在我的答案这个问题:http://stackoverflow.com/questions/14231872/force-app-to-refresh-image-from-url/14232252#14232252 – mortb

回答

0

你的理论认为这是缓存相关的是正确的 - 如果没有提供缓存控制头,包括POST,iOS 6会更积极地缓存。有关更多信息,请参阅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" /> 
+0

非常感谢对于上述,我一定会加入它。Safari浏览器/ ajax链接乍看起来非常积极,因此将在本周末消化。直到星期一我再也不能完全测试它了,所以如果我能得到它,我肯定会接受你的答案。 – harag

+0

您能否给我举一个例子,说明您如何在网络中进行连接。配置?道歉,这对我来说是新的。 – harag

+0

我已经为你更新了我的答案。 –