视图输出中的ASP.NET MVC2 CrAzY字符 - WTF

Cha*_*ell 7 asp.net asp.net-mvc asp.net-mvc-2

每当我运行我的应用程序时,我会在输出中找到真正"非常"奇怪的字符而不是相应的页面.现在我知道这是因为一些错误,但不幸的是错误并没有表现出它的自我,而只是产生奇怪的字符.

这是一个完整页面源代码的示例.

I?%&/m?{J?J??t??$ @ iG#) eVe ] f @ 흼 { { ; N' ?\fdl J ɞ〜|!?"安永')=y6hurjfŲIU<[2O 2_ ]i ߴ 肴] l g ~ O ,[f Wyq1o- z QS iUV I M ԃ z > EV_ Z=J T f Z gi r k ܷ ZPW4 ,KO eS y// m^ + EeB c j w , Vu Q $ n:@] uC_ X_E ^ DTM [ - ; wvVrMJYyuYP佑2uCw } V | WID\0>米ւH%YI)XdjUSzx ^ WŬvϚ$ G ^ Oqq {0.0 = 8fy6 .R〜;〔 BT〜/ Kz的|-Wź Q&4BQ4oux |wrtLKо$)Ms.4-ٺ1,4]>]˷7 !4IZcM; N_ye_q%L CPE9ejJ [^ fe1r֏p߯ uM 3 =B È ,H Y sz S̨ T ? } k p l _d ̼/ S [V"p} ^ JPQ!Z?<5???j??Wd?wc?O??0 ???O/??h?jv??a?????}?J??y??E???zA?h@??45e?e?4???e?u??v???N????C?b???zE??!???UY??X?s?l???#???}???m????/??u ?I????O??2[Lf????y5?:)?fM????(?Q???}??)!???????d???t|< ?PO $ ꀜ ?=6 < ?/ q> b 7 ^ (= {Z Y} u =8 u J D c vt O / 1ev} RfM3 /〜 h ϊ - } : a\ lZ <[/ Rv 5K(F C b {;? { {; ?{^4-R | > [6 : ps FA ' 7 ehU + R > 0{ ܍ FI; w œ 2JӼi r > po?j2 ] m U1{J /中,Cp ^ WJM $ 0 ^ 7D:NVD + T9C-X .ٹWW〜3A9vۮ-M/=> R |wǽyY8? { N # 7 ' /+ ͋UIJa fy v x ] x}?〜 1s u ! p ] 4 / i]5 y I A ^U T_{ ? 9 0=〜 e " p我ضNRK [Z {#. s @# M8|G C Y Q7z m/z (>> 9Տ7:EG N g7? = -19irz7vi4x76v> zv0〜3zn8 ]/H\ w q ? 9 k~3} 3 7 G: ߤ 〜 n q } ÿ Ō#6)2\LMS p 1\@ Vi3Rr'UcPDfhat :

我从未在Web表单中看到过这种情况.

编辑:

所以我今天做了一些测试,发现了一些有趣的东西.首先,应用程序抛出了Null Reference Exception(500).其次,本地调试器看到错误并立即投下黄色的死亡屏幕.坏文本显示在当前运行Release版本的Staging服务器上.

因此,在我的登台服务器上关闭了customErrors的Release版本基本上500个错误会抛出CrAzY字符而不是优雅地失败到黄色死亡屏幕.

编辑2:

根据@ Esteban的回答,这是我的压缩过滤器

Namespace Filters
    Public Class CompressFilter : Inherits ActionFilterAttribute
        ''' <summary>
        ''' GZip compresses each Action when loaded.  This satisfies YSlow and
        ''' PageSpeed.
        ''' </summary>
        ''' <param name="filterContext">The filter context.</param>
        Public Overrides Sub OnActionExecuting(ByVal filterContext As ActionExecutingContext)
            Dim request As HttpRequestBase = filterContext.HttpContext.Request

            Dim acceptEncoding As String = request.Headers("Accept-Encoding")

            If String.IsNullOrEmpty(acceptEncoding) Then
                Return
            End If

            acceptEncoding = acceptEncoding.ToUpperInvariant()

            Dim response As HttpResponseBase = filterContext.HttpContext.Response

            If acceptEncoding.Contains("GZIP") Then
                response.AppendHeader("Content-encoding", "gzip")
                response.Filter = New GZipStream(response.Filter, CompressionMode.Compress)
            ElseIf acceptEncoding.Contains("DEFLATE") Then
                response.AppendHeader("Content-encoding", "deflate")
                response.Filter = New DeflateStream(response.Filter, CompressionMode.Compress)
            End If
        End Sub
    End Class
End Namespace
Run Code Online (Sandbox Code Playgroud)

我通过基本控制器在每个控制器上全局设置此过滤器.如果没有其他500个错误,页面运行正常,但如果我有500错误偷看它是丑陋的头,我得到了时髦的角色.

此外,有时我的开发服务器上没有错误,但Staging服务器上有一个错误.最近,当我在登台服务器上没有更新的库时发生了这种情况,但它存在于我的Dev机器上.我可以在事件日志中看到错误,但我无法在网页上看到它......即使我将自定义错误设置为Off.

编辑3:

好的,现在我们发现这个错误是因为<CompressionFilter()>如果抛出500错误我没有解压缩流.无论如何都要弄清楚如何解压缩我的输出.

Sch*_*ime 2

这就是我为解决这个问题所做的事情。我仍在努力寻找更好的方法。将以下代码放入global.asax.cs中

    protected void Application_PreSendRequestHeaders()
    {
        HttpResponse response = HttpContext.Current.Response;
        if (response.Filter is GZipStream && response.Headers["Content-encoding"] != "gzip")
            response.AppendHeader("Content-encoding", "gzip");
        else if (response.Filter is DeflateStream && response.Headers["Content-encoding"] != "deflate")
            response.AppendHeader("Content-encoding", "deflate");
    }
Run Code Online (Sandbox Code Playgroud)

更新 请查看以下链接以获取更多信息,其中 Rick 使用以下内容来解决问题。将以下内容放入您的 global.asax.cs 中

protected void Application_Error(object sender, EventArgs e)
{
        // Remove any special filtering especially GZip filtering
        Response.Filter = null;
}
Run Code Online (Sandbox Code Playgroud)

http://www.west-wind.com/weblog/posts/2011/May/02/ASPNET-GZip-Encoding-Caveats