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

我最近遇到了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 

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

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

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

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

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

解决方案 :您需要为响应显式设置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) { } } 

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

这里的解决方案正在取代

 context.Response.Flush(); context.Response.Close(); 

 context.Response.End(); 

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

在我的情况下,问题是与缓存相关并且在执行CORS请求时发生。

强制响应头Cache-Control no-cache解决了我的问题:

[使用Symfony HttpFoundation组件]

 headers->add(array( 'Cache-Control' => 'no-cache' )); 

我也得到同样的错误。 此问题与缓存文件夹上的Web服务器用户权限有关。

由于他们的ASP.net核心项目的问题,有人在这里登陆,我能够通过添加IIS中间件来解决。

这是通过在实例化您的UseIISIntegration实例时添加UseIISIntegration来完成的。