【问题标题】:ASP.NET MVC 2 RC Caching ProblemASP.NET MVC 2 RC 缓存问题
【发布时间】:2010-01-08 12:49:17
【问题描述】:

自从从 mvc 2 beta 2 升级到 rc 后,我在 Internet Explorer 中提交 ajax 时遇到了问题。在执行 jquery 表单发布时,该函数将 url 返回到控制器操作。这与控制器动作正常工作,将其拾取为 ajaxrequest,然后通过管道返回部分视图以更新页面。这在 Firefox 中仍然可以正常工作,但是在 Internet Explorer 中,对控制器操作的最终调用现在来自缓存并返回,因此返回的是完整视图而不是部分视图。

我尝试将 outputcache 设置为 0 没有成功,我还尝试了这里描述的 nocache actionfilter Disable browser cache for entire ASP.NET website 没有运气。我可以阻止 IE 从缓存中提取的唯一方法是物理删除缓存的版本。

任何人有任何想法(抱歉,如果这不是很清楚,很难解释!)?

【问题讨论】:

    标签: asp.net-mvc internet-explorer browser-cache


    【解决方案1】:

    出于某种原因,IE 在缓存 AJAX GET 方面非常激进。因此,如果您通过 AJAX 获取它,那么这种行为对我来说并不奇怪。同样不足为奇的是,使用输出缓存属性并没有解决问题,因为它是 IE,而不是正在执行缓存的服务器。您需要做的是通过在 HTTP 中设置适当的标头来告诉 IE 不要缓存请求。以下是我们的做法:

        [CacheControl(HttpCacheability.NoCache), HttpGet]
        public JsonResult DoStuff()
        {
            //...
        }
    
    public class CacheControlAttribute : ActionFilterAttribute
    {
        public CacheControlAttribute(HttpCacheability cacheability)
        {
            this._cacheability = cacheability;
        }
    
        private HttpCacheability _cacheability;
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            cache.SetCacheability(_cacheability);
        }
    }
    

    【讨论】:

    • 谢谢你,奇怪的是这个系统在升级到候选发布之前运行良好。我已经实现了您的自定义属性,但不幸的是我仍然遇到同样的问题。
    • 仔细查看 (1) IE 发送的标头和 (2) 响应中的标头。您可以为此使用 Fiddler。如果您看到 IE 没有发出请求,那肯定是 IE,而不是服务器在进行缓存,并且您需要在 initial 页面加载中制作标题(服务器实际响应的标题)这样 IE 就不会缓存它。
    • 我已将 nocache 过滤器添加到整个控制器,它肯定会在初始加载时捕获它(通过断点检查)。正如您所说,该请求没有发出,并且来自缓存(根据调试栏)。例如,我在cancharda.selfip.com:51331/Admin/Events 上打开了我的开发框,如果单击任一事件旁边的铅笔图标,则会打开一个对话框,通过单击保存问题变得明显。谢谢你的帮助,我想我要疯了! :)
    • 尝试在过去设置Expires 标头。 ISTM 旧版本的 IE 不尊重Cache-Control。另见mnot.net/cache_docs
    • 太棒了,这让列表方面的工作正常了,奇怪的是,对初始操作应用相同的修复不是做同样的事情吗?但原问题已修复,非常感谢!!!
    【解决方案2】:

    我对 Craig 的出色解决方案的 2 美分 -

    如果您正在使用用户控件并使用“RenderAction”进行渲染

    <% Html.RenderAction("UserList", "User"); %>
    

    这个页面通过 GET 和 POST 调用它,然后不要在属性声明中提及请求方法。

    [CacheControl(HttpCacheability.NoCache)]
    

    例如,我有一个搜索网格和一个搜索面板。我已将我的 Grid 设为用户控件,以便我可以通过 AJAX (GET) 调用排序和分页,但当我按下“搜索”按钮 (POST) 时也会调用它,所以我两者都需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多