gpt4 book ai didi

asp.net-mvc - 抛出异常时gzip/deflate失败

转载 作者:行者123 更新时间:2023-12-04 16:40:46 24 4
gpt4 key购买 nike

我在ASP.NET MVC 3中遇到了一个gzip/deflate ActionFilterAttribute有趣的问题。如果我的应用程序抛出异常,而不是得到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��two������?������Ӈ���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#"�:�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)。因此,似乎我的异常处理(来自Elmah.Contrib.Mvc的 ElmahHandleErrorAttribute)暂停了其余过滤器,包括 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());

即使抛出异常,如何确保响应是可读的?

最佳答案

这是因为当应用程序中出现错误时,ASP.Net会删除所有自定义 header ,但过滤器仍然存在。您可以根据应用程序错误重置过滤器,以使问题消失。

protected void Application_Error(object sender, EventArgs e)
{
Response.Filter = null;
}

关于asp.net-mvc - 抛出异常时gzip/deflate失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com