У меня интересная проблема с 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());
Как я могу убедиться, что ответ доступен для чтения, даже если генерируются исключения?