Ошибка gzip / deflate при возникновении исключения

У меня интересная проблема с gzip / deflate ActionFilterAttribute в ASP.NET MVC 3. Если мое приложение генерирует исключение, вместо получения YSOD я получаю полный страницу тарабарщины, как показано ниже.

��� I�% & / m� {J�J��t�� $ ؐ @ ������� iG #) � * ��eVe] f @ � 흼 �� {���� {����; �N'���? \ Fdl��J�ɞ! ���? ~ |? "��Ey� ') = ��y6��� ��h����Z��2k�j���uU? � + _x-��: � �T����W�v� <[���� ~ 2�g�2���? �ʋ�y�hY Ջ������� t� _N���M�l������� {��, ���Xn���Q�} �������� * g������7�� ~ � �j'u> K� {_��IW4�> �U�w� | = -fYzR-������� | �� <& �o�Z () * �S! U ��k�g�������j��.����b} ��ή�9X / ��J�I ն�� Q���z�i�n�-g٤��� ݞ�� Y ^ ����H�8 / ��k�}] 7�ǜ @ � {| �g��wUd�O���� 죫 y���o-����� ݏ ��� �ZHv, �d] ��١�> o3� = �3x�7MN�����������Ow���w�.o��φ� <؟ M����; � ��vg���A> �� 䋟 {Y ޟ N�����Φ� $ p> q���� / �! �y��9�2�� два������? �� ����Ӈ���n�9�r� ^ ����! ������ {���ag�? \ 1 * c�?! �b ي ? ��� xI ����u�f ? �� {'�����P $ �v & = # s�l�_0����΃�w�ss����� 廌 �� ⼽ �r���! �� {k \ 7M��� (o������4� ߛ> �> � @ "| � | v���y5�����Q ꆦ R���JSK� & ����� ߛ� p� �����v <�C��t��1�hOI���y {j�] i���˷���� �D'p <� $ , �'M��r {-�} ��CF� ؛ �����A��9�� [�½�� �! 2�� �: ��! �� {�t�; � ߇ 'y��M�� + �M ^ # x ^ \ ����Q��jM�l��? (�] � ��IZ� ݟ [���� + 4 # "�: ������m�������dv> ������iL�̀I | �fL�TU��ho� � � {L��_t��5�o? ���h�O�UY] # �u� [���G� ޞ� = ���; ��8��� ~ ���� d �8k�w�����yw� ���� ֺ�� Nx��A��� [��xMo�� ۣ f��� / �Og�; y ~ ����!

Если я удалю свой CompressAttribute , он будет работать должным образом (я вижу YSOD).Таким образом, похоже, что моя обработка исключений ( ElmahHandleErrorAttribute из Elmah.Contrib.Mvc) останавливает остальные фильтры, включая CompressAttribute , и ответ не сдувается.

Соответствующий код:

public sealed class CompressAttribute : ActionFilterAttribute
{
    private const string _acceptEncodingHeader = "Accept-Encoding";
    private const string _contentEncodingHeader = "Content-Encoding";

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;

        string acceptEncoding = request.Headers[_acceptEncodingHeader];

        if (String.IsNullOrEmpty(acceptEncoding))
        {
            return;
        }

        acceptEncoding = acceptEncoding.ToUpperInvariant();

        HttpResponseBase response = filterContext.HttpContext.Response;

        if (acceptEncoding.Contains("GZIP"))
        {
            response.AppendHeader(_contentEncodingHeader, "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
            response.AppendHeader(_contentEncodingHeader, "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

Регистрация фильтра:

GlobalFilterCollection filters = GlobalFilters.Filters;
filters.Add(new ElmahHandleErrorAttribute(), 999); // Elmah.Contrib.Mvc
filters.Add(new CompressAttribute());

Как я могу убедиться, что ответ доступен для чтения, даже если генерируются исключения?

5
задан jrummell 15 February 2012 в 15:28
поделиться