ASP.NET MVC2 CrAzY-символы в представлении вывода - WTF - PullRequest
7 голосов
/ 06 июля 2010

Время от времени, когда я запускаю свое приложение, я получаю действительно «ДЕЙСТВИТЕЛЬНО» странные символы в своем выводе вместо соответствующей страницы. Теперь я знаю, что это из-за какой-то ошибки, но, к сожалению, ошибка не представляет себя, а просто производит странные символы.

Вот пример полного исходного кода страницы.

I�%&/m�{J�J��t�� $ @ Ig #) ЕВА] F @ 흼 {{; N» ? \ fdlJɞ ~ |!? "Еу) = y6hurjfŲIU <[2O2_] я ߴ 餚] Lg ~ О, [fWyq1o-ZQS iUV I M ԃ z > EV_ Z = J T f Z gi r k ܷ ZPW4 , KO eS יy / m ^ + E eB c j w , Vu Q $ п: @] uC_X_E ^ Dtm [-; wvVrMJYyuYP 祐2uCw} V | WID \ 0> т ւ ч% уг) Xd jUSzx ^ WŬ?vϚ $ G ^ {Oqq +0,0 = 8fy6 ? .r ~; [Вг ~ / К г | -WźQ и 4BQ4oux | wrtLKо $) Ms.4- ٺ 0,4]>] ˷7 4IZcM;! N_ye_q% L CPE9ejJ [^ fe1r ֏ р ߯ UM3 = В, HYszS̨T?} к Ⱊ pl_d̼ / S [V ", р} 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|< � РО $ ꀜ ? = 6 <</em>? / д> b7 ^ (= {Зи} и = й J D c vt O ܋ / 1ev} RfM3 / ~ h ϊ - } :? а \ LZ <[/ Rv5K (FCB {{{; {^ 4 - R |> [6: psFA'7ehU + R> 0 {܍ Ф.И. ; w œ 2JӼi r > po? J2 ] m U1 {J / , C p ^ W jm $ 0 ^ 7d:. ПНВ + t9c-х ٹ Ww ~ 3A9v ۮ- М / => R |? wǽyY 8 {N # 7 / + ͋UIJafyvx] х}? ~ 1su ! Р] 4 / я] 5у IA ^ УТ _ {? 90 = ~ е "пи ض NRK [г {# s @ # M8. | GCYQ7zm / г (>> 9 Տ 7: EGNg7 = - 19ir z7vi4x76v> zv0 ~ 3zn8] / H \ ? WQ 9 հ к ~ 3} 37G: ߤ ~ пд} у Ō # 6 ) 2 \ lM s p ^ \ @ Vi3 Rr 'Uc PDf h a t : D c җ E88 UHʹ 7 j * _Tm 岼 ֦4 U] ֬ | yYe 7 ' NJl

Я никогда не видел это с веб-формами.

EDIT:

Итак, сегодня я провел некоторое тестирование и нашел кое-что интересное. Прежде всего, приложение выдавало исключение Null Reference (500). Во-вторых, местный отладчик увидел ошибку и сразу бросил желтый экран смерти. Неверный текст показывался на промежуточном сервере, на котором в данный момент выполняется сборка выпуска.

Таким образом, в основном 500 ошибок в сборках Release с отключенными customErrors на моем промежуточном сервере выдают символы 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 ошибок, это ужасная голова, я получаю прикольные символы.

Кроме того, иногда у меня нет ошибки на моем сервере разработки, но есть на промежуточном сервере. Это произошло недавно, когда у меня не было обновленной библиотеки на промежуточном сервере, но она присутствовала на моей машине разработки. Я вижу ошибки в журнале событий, но не вижу их на веб-странице ... даже если для пользовательских ошибок установлено значение Off.

РЕДАКТИРОВАТЬ 3:

Хорошо, теперь мы обнаружили, что эта ошибка возникает из-за того, что мой <CompressionFilter()> не распаковывает поток, если выдается ошибка 500. Нужно понять, как распаковать мой вывод, несмотря ни на что.

Ответы [ 3 ]

2 голосов
/ 02 мая 2011

Это то, что я сделал, чтобы обойти проблему.Я все еще пытаюсь найти лучший способ.Поместите следующий код в 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");
    }

Обновление Проверьте следующую ссылку для получения дополнительной информации, где Рик использует следующее для решениявопрос.Поместите следующее в ваши 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 голос
/ 15 ноября 2010

Нет, это не проблема с некорректным набором символов; У меня было это раньше. Происходит то, что вы дефлируете контент и каким-то образом (либо возникает исключение, вы его забыли и т. Д.), Но не устанавливаете метод сжатия, который вы использовали в заголовках.

Теперь, чтобы действительно решить проблему, у вас есть несколько вариантов:

  1. Вкл (на global.asax или в пользовательском обработчике) Application_PreSendRequestHeaders проверить, не устарел ли контент и отсутствуют ли заголовки; Вы можете либо удалить содержимое, либо добавить заголовки.
  2. При ошибках удалите содержимое или добавьте правильные заголовки.

Надеюсь, это поможет.

1 голос
/ 15 ноября 2010

Похоже, это может быть проблема с неверной кодировкой набора символов, используемой в ответе?

Какую кодировку вы используете?Unicode / UTF8 или азиатский набор символов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...