【问题标题】:Invalidate Output Cache if there is an exception on the page如果页面上出现异常,则使输出缓存无效
【发布时间】:2012-05-22 00:47:18
【问题描述】:

我在其中一个页面中启用了输出缓存,如下所示:

<%@ OutputCache Duration="300" VaryByParam="*"%>

问题是有时会出现异常,我们会显示适当的消息。但是该页面随后被缓存,其他用户也看到了异常消息。例如,假设数据库超时并因此引发 Sql 异常。捕获此异常并显示消息“连接数据库时出错。请稍后再试”。现在这条消息被缓存并显示给其他用户,甚至不需要查询数据库。

所以我想要做的是在出现异常时使特定的输出缓存无效,或者在出现异常时可能不缓存。如何做到这一点?

这适用于 ASP.NET 3.5 Webforms。

【问题讨论】:

    标签: asp.net caching webforms outputcache


    【解决方案1】:

    你应该可以删除缓存项

    HttpResponse.RemoveOutputCacheItem("/MyPage/MyParameter");
    

    【讨论】:

    • +1 但是触发所有异常的最佳位置在哪里?在应用程序对象的异常处理程序中,或者页面上的某个地方,或者在控制器方法的 finally 中(如果它是 MVC,如果这还不算太早?)或其他地方?
    【解决方案2】:

    假设您的异常到达 Global.asax 中的 Application_Error,您可以尝试以下操作:

    public void Application_Error(Object sender, EventArgs e) {
        ...
    
        Response.Cache.AddValidationCallback(
            DontCacheCurrentResponse, 
            null);
    
        ...
    }
    
    private void DontCacheCurrentResponse(
        HttpContext context, 
        Object data, 
        ref HttpValidationStatus status) {
    
        status = HttpValidationStatus.IgnoreThisRequest;
    }
    

    这将确保下一个响应不会从缓存中提供,而是实际上会发送到您的页面/控制器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多