ASP.NET MVC响应过滤器+ OutputCache属性

Sha*_*ade 5 asp.net-mvc caching filter

我不确定这是一个ASP.NET MVC特定的东西或一般的ASP.NET,但这是正在发生的事情.我有一个动作过滤器,通过使用响应过滤器删除空格:

public class StripWhitespaceAttribute : ActionFilterAttribute
{
    public StripWhitespaceAttribute ()
    {

    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        base.OnResultExecuted(filterContext);

        filterContext.HttpContext.Response.Filter = new WhitespaceFilter(filterContext.HttpContext.Response.Filter);
    }
}
Run Code Online (Sandbox Code Playgroud)

当与OutputCache属性一起使用时,我对Response.WriteSubstitution的"donut hole caching"调用不起作用.第一次和第二次页面加载传递给WriteSubstitution的回调被调用,之后在输出缓存到期之前不再调用它们.我注意到这不仅仅是这个特殊的过滤器,而是Response.Filter上使用的任何过滤器......我错过了什么?

我也忘了提到我在没有使用MVC动作过滤器属性的情况下通过附加到global.asax中的PostReleaseRequestState事件并在那里设置Response.Filter值来尝试这个...但是仍然没有运气.

Joh*_*esH 2

AFAIK,问题是如果请求进入输出缓存,则操作过滤器不会被执行。AuthorizeAttribute 通过调用一些晦涩的输出缓存 API 来解决这个问题。但是,我认为这不是您想要做的事情的最佳解决方案。

您应该使用输出缓存,而不是围绕它。相反,您应该做的是确保在将响应存储到输出缓存之前将空格从响应中删除。

更新

似乎附加一个过滤器,无论什么过滤器,都会像您怀疑的那样禁用 WriteSubstitution 功能。我尝试使用反射器跟踪 HttpResponse 类中的踪迹,但找不到任何证据来证实这一怀疑。我认为答案就在 HttpWriter 类中。

另一个更新

碰巧我目前正在阅读 Steve Sanderson 撰写的优秀书籍“Pro ASP.NET MVC Framework”(如果您还没有的话,请购买它)。在第 10 章中,他链接到他博客上的一篇文章,其中讨论了部分输出缓存以及 MVC 框架和输出缓存之间的不良集成。我还没有在帖子中尝试过自定义输出缓存属性...我会尝试一下,并让您知道它是否可以解决问题。