我不确定这是一个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);
}
}
当与OutputCache属性一起使用时,我对Response.WriteSubstitution的“donut hole caching”调用不起作用。第一次和第二次页面加载传递给WriteSubstitution的回调被调用,之后在输出缓存到期之前不再调用它们。我注意到这不仅仅是这个特殊的过滤器,而是Response.Filter上使用的任何过滤器...我错过了什么?
我也忘了提到我在没有使用MVC动作过滤器属性的情况下通过附加到global.asax中的PostReleaseRequestState事件并在那里设置Response.Filter值来尝试这个...但是仍然没有运气。< / p>
答案 0 :(得分:3)
此KB article可能会提供有关此问题根本原因的一些信息。当IIS6中的过滤器“中断”缓存时,它会在IIS 7中引发错误。这似乎是设计/测试时间的最佳改进。
以下是MS Dev Support在此问题上的官方“回答”。
问题:
在以下情况下,ASP.NET中用于修改由另一个进程呈现的HTML的响应过滤的替代方法是什么:
1.其他过程无法修改
2.必须支持缓存后替换
答案:
“是的,你的问题显然是蓝天,这是官方声称不支持。因为后缓存替换会将某些替换块组合到响应字节,而响应过滤期望过滤响应的原始字节(未修改)因此,之前组合的替换块不再被保留。
到目前为止,还没有微软的替代方案。“
答案 1 :(得分:2)
AFAIK,问题是如果请求进入输出缓存,则不会执行操作过滤器。 AuthorizeAttribute通过调用一些模糊的输出缓存API来解决此问题。但是,我不认为这是你想要做的最好的解决方案。
您应该使用输出缓存,而不是它周围。你应该做的是确保在将响应存储到输出缓存之前从响应中删除空格。
<强>更新强>
似乎无论使用什么过滤器,附加过滤器都会禁用您怀疑的WriteSubstitution功能。我已经尝试使用反射器跟踪HttpResponse类中的跟踪,但我找不到任何证实这种怀疑的证据。我认为答案在于HttpWriter类。
另一次更新
碰巧我正在阅读Steve Sanderson的优秀书籍“Pro ASP.NET MVC Framework”(如果您还没有它,请购买它)。在chapter 10中,他链接到post on his blog,在那里他讨论了部分输出缓存以及MVC框架和输出缓存之间的不良集成。我还没有在帖子中尝试过自定义outputcache属性......我会尝试一下,让你知道它是否能解决问题。