【问题标题】:ASP.Net MVC2 (RTM) breaks response filtering - "Filtering is not allowed"ASP.Net MVC2 (RTM) 中断响应过滤-“不允许过滤”
【发布时间】:2010-04-06 18:32:39
【问题描述】:

我刚刚完成了将项目升级到 ASP.Net MVC 2 (RTM) 的测试运行,期待本月晚些时候发布完整的官方 .Net 4.0 版本。

我们的应用程序正在为我们的 CSS 和 javascript 使用最小化程序。为此,它利用HttpResponse.Filter 属性设置自定义过滤器。

升级后,此属性的设置器会抛出 HttpException 表示“不允许过滤”。看看反射器中的HttpResponse.Filter 属性显示了这一点:

  set
    {
        if (!this.UsingHttpWriter)
        {
            throw new HttpException(SR.GetString("Filtering_not_allowed"));
        }

...

private bool UsingHttpWriter
{
    get
    {
        return ((this._httpWriter != null) && (this._writer == this._httpWriter));
    }
}

显然,HttpResponse 写入 MVC2 中的输出流的方式发生了一些变化。有谁知道变化是什么,或者至少是一种解决方法?

编辑:这似乎相当激进。一些进一步的调查显示 ASP.Net MVC 2 RTM 使用 System.Web.Mvc.ViewPage.SwitchWriter 作为 HttpResponse 的输出属性,而 MVC 1 使用普通的旧 HttpWriter。这就解释了为什么抛出异常。

但这并不能解释为什么他们选择完全破坏此功能。 This thread 似乎表明这只是暂时的……但这让我很紧张……毕竟这是 RTM。

对此表示赞赏。

【问题讨论】:

  • 不管怎样,MVC 2 RTM 已经发布:microsoft.com/downloads/…
  • 谢谢 - 这就是我要升级到的。我应该让标题更清楚。
  • 您尝试做的事情可能一开始就没有得到支持。如果您实际上是在尝试挂钩静态内容的提供方式,请不要通过 WebForms 视图引擎来实现这一点。你到底想做什么?为什么你需要一个过滤器来解决这个问题?
  • 为什么不支持?而且我们没有通过视图引擎——我们只是在查看渲染结果。关键是这个改变甚至打破了简单的过滤,比如这个例子:4guysfromrolla.com/articles/120308-1.aspx。您基本上永远不能设置过滤器属性。
  • 另外,如果必须的话,我对重构旧代码以使用不同的方法没有疑虑。我想我的问题是 - “为什么会发生这种情况,它是永久性的,是否有解决方法?”

标签: c# asp.net asp.net-mvc asp.net-mvc-2 httpresponse


【解决方案1】:

与常规的 .aspx 页面不同,MVC 中的视图被视为 HTML 模板系统。这里的问题源于这样一个事实:在视图已经开始执行之后,页面试图安装一个响应过滤器来操作发送给客户端的 HTML。

这种情况下的解决方案是将响应过滤器安装移动到 MVC 管道的较早部分。例如,使用自定义操作过滤器,您可以覆盖 OnResultExecuting() 方法来安装自定义响应过滤器。这会将安装移出视图,并且不违反简单的纯 HTML 视图的原则。

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2011-09-20
    • 2019-01-13
    • 2021-09-10
    • 2023-03-10
    相关资源
    最近更新 更多