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

时间:2010-07-06 02:47:50

标签: asp.net asp.net-mvc asp.net-mvc-2

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

以下是完整页面源代码的示例。

  

I�%&/m�{J�J��t�� $ @ IG#)的前夕F的@흼{{; N '\fdlJɞ〜|?!?“安永')= y6hurj fŲIU的百分比抑制率2O2_] i的ߴ肴] LG〜O,[fWyq1o-Z QS iUV I M ԃ z &gt; EV_ Z=J T f Z gi r k ܷZPW4 ,KO eS יy / m^ + EeB c j w ,VuQ $ N:@] uC_X_E ^ DTM [ - ; wvVrMJYy UYP佑2uCw} V | WID \ 0&GT;米ւH%yi)的XdjUSzx ^WŬvϚ$ G ^ Oqq {0.0 = 8 FY6 .R〜; [Bt基因〜/ K ž|-WźQ和放大器; 4BQ4oux |wrtLKо$)Ms.4-ٺ 0.4] GT;]˷74IZcM;!N_ye_q%L CPE9ejJ [ ^ fe1r֏p߯UM3 = BE,HYszS̨T?} < EM>ķⰚpl_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&GT; B7 ^ (= {ZY} U =8 u J D c vt O / 1ev}RfM3 / 〜 h ϊ ϊ - }:一个\ LZ的百分比抑制率/ Rv5K(FCB {; {{? ; {^ 4-   [R |&GT; [6:psFA'7ehU + R大于0 {܍ FI; w œ 2JӼi r &gt; po?j2 ] m U1{J / , C p^ WJM $ 0 ^ 7D:NVD + T9C-XٹWW〜3A9。 vۮ-M / =&GT; R |wǽyY8 {N   #7 '/ +͋UIJafyvx]×}?〜1SU   !P] 4 / I] 5Y IA ^ UT _ {?90 =〜 E“PIضNRK [Z {#小号@#M8。|   GCYQ7zm / Z(大于;&GT; 9Տ7:EGNg7 = - 19ir z7vi4x76v&GT; zv0〜3zn8] / H \   ?WQ 9հK〜3} 37G:ߤ〜NQ}ý < / em> Ō# 6 ) 2\ lM s p^ \ @ Vi3 Rr 'Uc PDf h a t : D c җ E88 UH' 7 j *_Tm 岼4 U] |yYe 7 ' NJL,

我从未在网络表单中看到这一点。

编辑:

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

因此,在我的登台服务器上关闭了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

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

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

编辑3:

好的,现在我们发现此错误的发生是因为如果抛出500错误,我的<CompressionFilter()>不会解压缩流。无论如何都要弄清楚如何解压缩我的输出。

3 个答案:

答案 0 :(得分: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");
    }

<强>更新 有关Rick使用以下方法解决问题的更多信息,请查看以下链接。将以下内容放在global.asax.cs

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

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

答案 1 :(得分:1)

这看起来可能是在响应中使用无效字符集编码的问题吗?

你正在使用什么编码? Unicode / UTF8还是亚洲字符集?

答案 2 :(得分:1)

不,这不是无效的字符集问题;我之前发生过这种事。发生了什么事情是你正在缩小内容并以某种方式(发生异常,你忘了等)没有设置你在标题中使用的压缩方法。

现在,要实际解决问题,您有几个选择:

  1. 开启(在global.asax或自定义处理程序中)Application_PreSendRequestHeaders,以查看内容是否已取消隐藏且标头丢失;您可以缩小内容或添加标题。
  2. 在出现错误时,缩小内容或添加正确的标题。
  3. 希望有所帮助。