English 中文(简体)
如果出现例外情况,HttpHandler的答复中就消失了“自发编码”头盔。
原标题:"Content-encoding" header disappears from HttpHandler response if an exception occurs

我有习惯HttpHandler,我以人工方式使产出压缩。

context.Response.AppendHeader("Content-encoding", "gzip");
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);

对大多数请求来说,这项工作是很明智的,但在遇到例外情况时,“自动编码”头盔从反应中消失,而压缩过滤器仍然有效。 结果是,错误的页数压缩,但浏览器没有显示这一事实的头脑。 然后,浏览器试图将仍然压缩的数据作为文本,即gobbledygook

完整的测试个案代码如下所示。 另一种做法是打消压缩,或者不放弃例外。

谁能说明为什么出现“自发-冷藏”头盔?

我认为,我可以简单地把压缩作为“last的”手法,这样,如果遇到例外情况,就永远不会达到添加压缩过滤器的点;但我看到的行为是 b。 谁能证实?

public class TestHandler : IHttpHandler 
{
    public void ProcessRequest(HttpContext context)
    {
        CompressResponse(context);
        context.Response.Write("Hello world");

        // Throw an exception for testing purposes
        throw new Exception("Just testing...");
    }

    private void CompressResponse(HttpContext context)
    {
        string acceptEncoding = context.Request.Headers["Accept-Encoding"];
        if (String.IsNullOrEmpty(acceptEncoding))
        {
            return;
        }

        // gzip or wildcard
        if (acceptEncoding.ToLower().Contains("gzip") || acceptEncoding.Contains("*"))
        {
            context.Response.AppendHeader("Content-encoding", "gzip");
            context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
            return;
        }

        // Also handles deflate (not shown here)
        // <snip>
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

EDIT: Screenshot of the still-encoded response I m see with my test case: https://i.stack.imgur.com/R3Wmq.png

问题回答

当在<>WebForms申请上强迫gzip时,我就发生了同样的事情。 为了确定其位置,我不得不在Application_Error全球方法中清除过滤器。

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

之所以出现这种情况,是b/c 过滤器在投影机出现错误之前就被设定。 出于某种原因,黄色屏幕错误信息显示内容编码的头盔,但对应变过滤器没有任何影响。

如果你有例外,那么服务器将冲淡目前安装的头盔和内容,因为它们是错误的,正如你在全部安装后所做的那样。

至少清楚的是,你将要发出的200个地位(因为所有不改变现状的成功反应都发出200个,而无动于衷的例外,它不再是可笑的)是错误的,但与你所要做的事情相关的所有其他事情却未能实现,因此,它造成了所有错误,而且都是不正确的。

过滤器是 t。

酌情在错误的网页上重新打头盔,或者不设置过滤器,除非你能够确保一切都能够流畅。 我再说一遍,没有理由也压缩错误页数。

如果你称之为,你可以寄出一个头盔,因为你会流出。 谁要走?

我也遇到了这一问题。 难以追踪。 我不了解整个局势的具体细节,但我认为发生的情况是,有传闻。

当你首先这样做时:

context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);

页: 1 通常将列入<条码>。 声明如有任何错误,将予以妥善处置

因此,如果情况不正确,就存在问题。 。 随后是疯狂的(如你屏幕上所示)。

恐惧不是! 解决这一问题确实容易。 过滤器的处置。 很幸运的是,已经有一个地方可以采用这一全球检查来进行过滤处理。

global.asax.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        filters.Add(new HandleErrorAttribute());//default handler
        filters.Add(new HandleErrorEncodingAttribute());//extra check for filter disposal
}

<errorhandler namespace

public class HandleErrorEncodingAttribute : FilterAttribute, IExceptionFilter
{
    public virtual void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
        if (filterContext.IsChildAction)
        {
            return;
        }
        // If custom errors are disabled, we need to let the normal ASP.NET exception handler
        // execute so that the user can see useful debugging information.
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.HttpContext.Response.Filter.Dispose();//fixes response stream
            return;
        }
    }
}

我测试你的法典,我找不到任何问题。 是否没有确定烟.,但过滤器也没有安装,因为烟雾控制并产生错误。

使头盔变迁成为一个真正的问题

 CompressResponse(context);
 context.Response.Flush(); 

如果我强迫头盔,那页就不正确。

这里也许有两个想法是你的问题。 页: 1

context.Response.ContentEncoding = new UTF8Encoding();

页: 1 类型

context.Response.ContentType = "text/plain";

也许其中一部分是你没有更正页的原因。 在我进行测试时,你所描述的问题怎么样。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Transaction handling with TransactionScope

I am implementing Transaction using TransactionScope with the help this MSDN article http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx I just want to confirm that is ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

Microsoft.Contracts namespace

For what it is necessary Microsoft.Contracts namespace in asp.net? I mean, in what cases I could write using Microsoft.Contracts;?

Separator line in ASP.NET

I d like to add a simple separator line in an aspx web form. Does anyone know how? It sounds easy enough, but still I can t manage to find how to do it.. 10x!