У меня есть интересная проблема с gzip / deflate ActionFilterAttribute в ASP.NET MVC 3. Если в моем приложении возникает исключение, вместо получения YSOD я получаю полную страницу, как показано ниже.
��� I�%&/m�{J�J��t��
$ ؐ @ ������� iG #) � * ��eVe] f @ � 흼 �� {���� {����; �N'\ fdlJɞ ~ |?!? "Еу) = y6hZ2kjuU? � + _x-��: � ����T����W�v� <[���� ~ 2�g�2���? �ʋ�y�hY Ջ������� t� _N���M�l������� {��, ���Xn���Q�} �������� * g�������7�� ~� <code>�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��two������?������Ӈ���n�9�r�^����!������{���ag�?\1*c�?!�bي? ���xI����u�f? �� {'�����P $ �v & = # s�l�_0�����w�ss����廌 ⼽ г! {к \ 7М (o4 ߛ >> @ "|| vy5В ꆦ RJSK & ߛ р <Сt��1�hOI���y {j�] i���˷���� �D'p <� $ <code>,�'M��r{-�}��CF�؛�����A��9��[�½�� �!
2�� �:��!��{�t�;�߇'y��M��+�M^#x^\����Q��jM�l��?(�]�
��IZ�ݟ[����+4#"�:�X����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());
Как я могу убедиться, что ответ доступен для чтения даже при возникновении исключений?