每当我运行我的应用程序时,我会在输出中找到真正“非常”奇怪的字符而不是相应的页面。现在我知道这是因为一些错误,但不幸的是错误并没有表现出它的自我,而只是产生奇怪的字符。
以下是完整页面源代码的示例。
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字符而不是优雅地失败到黄色死亡屏幕。
根据@ 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
。
好的,现在我们发现此错误的发生是因为如果抛出500错误,我的<CompressionFilter()>
不会解压缩流。无论如何都要弄清楚如何解压缩我的输出。
答案 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)
不,这不是无效的字符集问题;我之前发生过这种事。发生了什么事情是你正在缩小内容并以某种方式(发生异常,你忘了等)没有设置你在标题中使用的压缩方法。
现在,要实际解决问题,您有几个选择:
Application_PreSendRequestHeaders
,以查看内容是否已取消隐藏且标头丢失;您可以缩小内容或添加标题。希望有所帮助。