繁体   English   中英

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

[英]IIS & Chrome: failed to load resource: 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 请求的响应流并且响应的 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-Controlno-cache解决了我的问题:

[使用 Symfony HttpFoundation组件]

<?php
$response->headers->add(array(
   'Cache-Control' => 'no-cache'
));

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

万一有人因为 ASP.net Core 项目的问题登陆这里,我能够通过添加 IIS 中间件来解决。

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

一旦我遇到同样的问题,主要原因在于我的控制器返回类型。 如果您尝试按原样返回C# object ,您将只会得到net::ERR_INCOMPLETE_CHUNKED_ENCODING所以不要忘记在将它们发送给java script客户端(或View )之前序列化您的复杂对象。 即我的控制器返回类型是:

public async Task<List<ComplexModel>> GetComplexModelList(){
    return new List<ComplexModel>()
}

这导致了INCOMPLETE_CHUNKED_ENCODING错误,所以我尝试用以下方法修复我的错误:

using Newtonsoft.Json;
...
public async Task<string> GetComplexModelList(){
    return JsonConvert.SerializeObject(new List<ComplexModel>())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM