IIS和Chrome:无法加载资源:net :: ERR_INCOMPLETE_CHUNKED_ENCODING

chr*_*oph 19 c# iis google-chrome web-applications

我最近遇到了Chrome问题,我认为值得与您分享.

我使用HttpHandler处理自编写的API,主要应该返回json数据.但是当发生错误时我想显示一个html文件.这在IE和FF中效果很好,但在Chrome中却没有.

期待开发人员工具发现此错误:net :: ERR_INCOMPLETE_CHUNKED_ENCODING

谷歌对此问题的评价不是很多,而且非常受欢迎.我所知道的是,经过一段时间后,它神奇地消失了.

我发现它放在这行代码上:

result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error
Run Code Online (Sandbox Code Playgroud)

删除最后一行后效果很好.我不知道为什么只有Chrome有这个问题,但似乎我在Chrome读完之前关闭了响应流.

我希望它可以帮助那些遇到相同或类似问题的人.

现在我的问题是:关闭/刷新响应流的最佳实践是什么?有规则吗?

小智 13

根据ASP.NET设置的转移编码为过早刷新响应的响应:

ASP.NET会以分块编码(Transfer-Encoding:chunked)将数据传输到客户端,如果您过早地为Http请求刷新Response流,并且您没有明确设置Response的Content-Length头.

解决方案:您需要为Response显式设置Content-Length标头,以防止ASP.NET在刷新时分块响应.

这是我用来阻止ASP.NET通过设置所需标头来分块响应的C#代码:

protected void writeJsonData (string s) {
    HttpContext context=this.Context;
    HttpResponse response=context.Response;
    context.Response.ContentType = "text/json";
    byte[] b = response.ContentEncoding.GetBytes(s);

    response.AddHeader("Content-Length", b.Length.ToString());

    response.BinaryWrite(b);
    try
    {
        this.Context.Response.Flush();
        this.Context.Response.Close();
    }
    catch (Exception) { }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

我在生成文件并将其推送给用户下载时遇到此错误,但仅偶尔发生.当它没有失败时,文件始终是2个字节的短.Close()强制关闭连接,无论它是否完成,在我的情况下它不是.如问题所示,将其遗漏,意味着生成的文件既包含生成的内容,也包含整个页面的HTML.

这里的解决方案正在取代

context.Response.Flush();
context.Response.Close();
Run Code Online (Sandbox Code Playgroud)

context.Response.End();
Run Code Online (Sandbox Code Playgroud)

它做同样的事情,但没有缩短交易时间.